Имя: Пароль:
1C
1C 7.7
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) кинула файлик в почту
заодно и на инфостарте разместила, несмотря на тамошние нынешние безобразия ))