|
v7: Как в рамках 7.7 перебрать файлы дерева каталогов? | ☑ | ||
---|---|---|---|---|
0
heap
08.11.11
✎
20:53
|
Есть подчиненные каталоги. Мне нужно программно перебрать и обработать все файлы с расширением txt. Возможно ли это?
|
|||
1
Азат
08.11.11
✎
20:54
|
Да, возможно...
|
|||
2
heap
08.11.11
✎
20:57
|
А как?
|
|||
3
Aleksey
08.11.11
✎
21:05
|
А чем НайтиПервыйФайл("*.txt") не нравиться?
|
|||
4
FN
08.11.11
✎
21:06
|
(2)например так:
каомандасистемы("DIR *.txt /b>c:\files.txt"); Текст=СоздатьОбъект("текст"); текст.Открыть("c:\files.txt"); Для х=1 по Текст.КоличествоСтрок() .... :):):) |
|||
5
heap
08.11.11
✎
21:08
|
(3) НайтиПервыйФайл("*.txt") не работает (по крайней мере у меня)
(4) А вот за эту подсказку спасибо |
|||
6
ДенисЧ
08.11.11
✎
21:10
|
(5) У всех работает, а у тебя нет... Так может в консерватории что-то подправить?
|
|||
7
ДенисЧ
08.11.11
✎
21:10
|
(4) только на с:\ прав на запись нет :-)
|
|||
8
FN
08.11.11
✎
21:11
|
(7) у кого как...
|
|||
9
Aleksey
08.11.11
✎
21:12
|
(5) А УстТекКаталог делал?
|
|||
10
heap
08.11.11
✎
21:12
|
(5) вот как я пытаюсь сделать:
Каталог = "B:\дир\"; Имя=ФС.НайтиПервыйФайл(Каталог+"*.txt"); В результате получаю имя="" |
|||
11
Aleksey
08.11.11
✎
21:13
|
А где УстТекКаталог ?
|
|||
12
ЧеловекДуши
08.11.11
✎
21:14
|
(10)В "ФС.НайтиПервыйФайл(Каталог+"*.txt");" пишется только имя файла
, а каталог устанавливается командой "УстТекКаталог(<Свой каталог>)" |
|||
13
heap
08.11.11
✎
21:15
|
(12) Спасибо. А свой каталог = "B:\дир\" ?
|
|||
14
Aleksey
08.11.11
✎
21:16
|
(13) Да
|
|||
15
ЧеловекДуши
08.11.11
✎
21:16
|
+(13)Писать моно не только полное имя, а еще маску.
|
|||
16
Aleksey
08.11.11
✎
21:16
|
(13) У тебя тоже ДенисЧ СП украл?
|
|||
17
heap
08.11.11
✎
21:16
|
ОК!
|
|||
18
heap
08.11.11
✎
21:20
|
(15) @Писать моно не только полное имя, а еще маску@
В имени файла, - понятно! Но как залезть во все ветки дерева каталогов? (Имена каталогов уникальны) |
|||
19
ДенисЧ
08.11.11
✎
21:23
|
(18) Рекурсия божественна!
|
|||
20
heap
08.11.11
✎
21:27
|
(19) Пока четко не представляю как организвать перебор имен через рекурсию, но попробую...
|
|||
21
1Сергей
08.11.11
✎
21:27
|
(18) перебирать можно не только файлы, но и каталоги
|
|||
22
Chai Nic
08.11.11
✎
21:28
|
(20) Познание сущности рекурсии сделает тебя программистом!
|
|||
23
heap
08.11.11
✎
21:30
|
(22) Да работал я с ней, красиво все получается! Но в данном случае есть нечто новое
|
|||
24
heap
08.11.11
✎
21:30
|
(21) Уточнить можешь?
|
|||
25
FN
08.11.11
✎
21:34
|
(24)
Примерно так: Функция СканироватьКаталог(Имякаталога) ... перебор "файлов" Если АтрибутыФайла(....) = это каталог тогда СканироватьКаталог(ТекущийФайл) КонецЕсли КонецФункции |
|||
26
FN
08.11.11
✎
21:34
|
+ на всякий случай:
АтрибутыФайла(<?>,,,,,,); Синтаксис: АтрибутыФайла(<ИмяФайла>,<РазмерФайла>,<АтрибутыФайла>,<ВремяСоздания>,<ВремяПоследнегоДоступа>,<ВремяПоследнейЗаписи>,<РасширенноеИмяФайла>) Назначение: Возвращает атрибуты файла (в параметрах). Параметры: <ИмяФайла> - строка с именем файла; <РазмерФайла> - переменная, принимающая размер файла в байтах; <АтрибутыФайла> - переменная, принимающая атрибуты файла; Возвращаемое строковое значение длиной 9 символов, в котором закодированы атрибуты файла. Символы могут принимать значения ''0'' или ''1'': первый символ: если ''1'' - файл только для чтения; второй символ: если ''1'' - скрытый файл; третий символ: если ''1'' - системный файл; четвертый символ: если ''1'' - каталог; пятый символ: если ''1'' - архивный файл; шестой символ: если ''1'' - обычный файл (все другие атрибуты не установлены); седьмой символ: если ''1'' - временный файл; восьмой символ: если ''1'' - файл, сжатый каким-либо архиватором; девятый символ: если ''1'' - нет доступа к файлу. <ВремяСоздания> - переменная, принимающая строку с датой и временем создания файла; <ВремяПоследнегоДоступа> - переменная, принимающая строку с датой и временем последнего доступа к файлу; <ВремяПоследнейЗаписи> - переменная, принимающая строку с датой и временем последней записи файла; <РасширенноеИмяФайла> - переменная, принимающая строку с полным именем файла. Подробнее см. в книгу ''1С:Предприятие 7.7. Описание встроенного языка. Часть 2'', глава 37 ''Работа с Файлами''. |
|||
27
Chai Nic
08.11.11
✎
21:35
|
Это по сути обычный findfirst/findnext из системного API работы с файлами
|
|||
28
heap
08.11.11
✎
21:39
|
(25) Спасибо
|
|||
29
heap
16.11.11
✎
17:55
|
Наконец-то дошли руки до реализации вышеуказанного перебора папок/файлов. К сожалению есть проблема. При выходе из подчиненной папки, после перебора там файлов, перебор папок текущего уровня не работает. Первый же операор < Возврат ""; > приводит к полному завершению просмотра
Функция СканироватьКаталог(ИмяКаталога) Перем КодФайла, ИмяФайла; ФС.УстТекКаталог(ИмяКаталога); ИмяФайла=ФС.НайтиПервыйФайл("*.*"); Если ИмяФайла="." Тогда ИмяФайла=ФС.НайтиСледующийФайл(); КонецЕсли; // ~М1: ИмяФайла=ФС.НайтиСледующийФайл(); //перебор "файлов" Если ИмяФайла="" Тогда Возврат ""; //здесь завершаем просмотр файлов/папок очередного уровня КонецЕсли; // ФС.АтрибутыФайла(ИмяФайла,,КодФайла,,,,); // Если Сред(КодФайла,4,1) = "1" Тогда Сообщить(КодФайла+" "+ИмяФайла); СканироватьКаталог(ИмяКаталога+ИмяФайла+"\"); //*** Иначе Если Найти(ИмяФайла,".txt")>0 Тогда //будет обработка КонецЕсли; Сообщить(" "+КодФайла+" "+ИмяФайла); КонецЕсли; Перейти ~М1; КонецФункции |
|||
30
Барбариска
16.11.11
✎
18:08
|
Есть готовый кусок кода для построения дерева каталога.
Красииииива - даже выводит в табличку с крестиками - свернуть/развернуть )) Но там все на вложенных таблицах значений и на рекурсиях и принципиально без ~М1 )) Так что если нужно в каком-то другом виде - переделывать нужно |
|||
31
heap
16.11.11
✎
18:21
|
(30) Можно и с циклом сделать с досрочным завершением по условию. Но это не принципиально.
Наталья, а можешь выслать мне этот "готовый кусок кода"? |
|||
32
Барбариска
16.11.11
✎
18:25
|
Если вечером и из дома - то могу.
А про "циклы и досрочные завершения" - даже Аленку, которая С++ учит, "воспитую" ))принципиально )) Если меня совсем сегодня на замучат этим С++ то вечером сделаю |
|||
33
smaharbA
16.11.11
✎
18:26
|
а чо такая длинная ветка ?
|
|||
34
smaharbA
16.11.11
✎
18:27
|
(29) передавай в список в параметре процедуры, функция тут не нужна
|
|||
35
smaharbA
16.11.11
✎
18:28
|
+ и зачем метка ?
|
|||
36
FN
16.11.11
✎
19:48
|
(29)
Функция СканКаталога(ИмяКаталога) Если Прав(ИмяКаталога,1)<>"\" Тогда ИмяКаталога=ИмяКаталога+"\"; КонецЕсли; спКаталогов=СоздатьОбъект("СписокЗначений"); ФС1=СоздатьОбъект("ФС"); ФС1.УстТекКаталог(ИмяКаталога); ИмяФайла=ФС1.НайтиПервыйФайл("*.*"); Пока ПустоеЗначение(ИмяФайла)=0 Цикл Если Лев(ИмяФайла,1)="." Тогда ИмяФайла=ФС1.НайтиСледующийФайл(); Продолжить;КонецЕсли; Атр=""; ФС1.АтрибутыФайла(ИмяФайла,,Атр); Если Сред(Атр,4,1)="1" Тогда спКаталогов.ДобавитьЗначение(ИмяКаталога+ИмяФайла); ИмяФайла=ФС1.НайтиСледующийФайл(); Продолжить; Иначе Сообщить(ИмяКаталога+ИмяФайла); ИмяФайла=ФС1.НайтиСледующийФайл(); КонецЕсли; КонецЦикла; Для х=1 по спКаталогов.РазмерСписка() Цикл СканКаталога(спКаталогов.ПолучитьЗначение(х)); КонецЦикла; КонецФункции // СканКаталога |
|||
37
Барбариска
16.11.11
✎
19:51
|
(31) кинула файлик в почту
заодно и на инфостарте разместила, несмотря на тамошние нынешние безобразия )) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |