v7: ФС.НайтиСледующийФайл - как исключить заход в подпапку? #592351


#0 by Vladal
Понимаю, что пятница. конец рабочего дня. Перебираю папку с файлами методом ФС.НайтиПервыйФайл и ФС.НайтиСледующийФайл. Довольно удобная штука, т.к. рекурсивно заходит в подпапки и читает все файлы оттуда. Замер производительности ругается именно на процедуру поиска файлов. Думал выбрать все файлы и отсеивать только *.ert, но приросту никакого - 1С затрачиывает дополнительное время на сравнение условий. Как исключить эту конкретную подпапку, в которой более 20'000 файлов и там явно нет *.ert?
#1 by zak555
продолжить ?
#2 by Гот
Храни ерт в другом месте
#3 by Mikeware
dir'ом в файл, файл разбирать :-)
#4 by Vladal
Не пойдёт. Надо найти все обработки во всех подпапках рекурсивно. Но тут попадается та папка с ненужными мне файлами, ФС её читает и всё. Это особенность движка ФС или каким способом еще можно?
#5 by Vladal
О! Эврика! Может WSH задействовать?
#6 by Vladal
Вроде как нашел способ. Теперь вместо сообщения надо файл в список совать. А как - тупонька не соображает: On Error Resume Next Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\. ootCIMV2") If Err.Number <> 0 Then    WScript.Echo Err.Number & ": " & Err.Description For Each objFile In colFiles Next WScript.Echo "Всего файлов: " & colFiles.Count
#7 by FN
Два прохода - первым собираешь папки, вторым файлы
#8 by Vladal
Так и есть. Но ФС.НайтиСледующийФайл лопатит опять весь диск и в том числе ненужную папку. К WSH руки пока не дотянулись, но он сработал значительно быстрее.
#9 by ДенисЧ
гонишь. НайтиСледующийФайл вызывает системную функцию.
#10 by Vladal
Замером производительности замерял.
#11 by Vladal
У меня 112 секунд процедура поиска папок занимает и 146 секунд складирование файлов:
#12 by FN
потом проход по списку с помощью ФС.НайтиПервыйФайл(Каталог+"*.ert");
#13 by Ковычки
Shell.Application + Filter
#14 by Vladal
Вот про этот самый Shell.Application  рою.
#15 by Vladal
О! dir /AD /S /B что-то прояснило
#16 by Torquader
For Each f in d.Files ;перебираем файлы Next For Each p In d.SubFolders ;перебираем вложенные директории Next Что касается работы с директорией, где много файлов, то любая системная функция при пролистывании или выводит содержимое всей директории сразу или при каждом вызове делает перебор заново, чтобы выбрать следующий по номеру файл.
#17 by Vladal
Вот мне-то как раз и надо тут папку с многофайлами пропустить. Megj в неё не заходить. Я согласен в первый раз прочитать все подпапки, составить их список и потом заходить в них. Пример: КорневаяПапка + Подпапка1 + Подпапка3 + Подпапка4 --- вот эту надо пропускать + Подпапка5 Составили список файлов, потом в каждую кроме 4-й заходим и читаем список вложенных файлов.
#18 by Vladal
Я составляю список подпапок, пропуская Подпапку4, потом по списку иду и рекурсивно создаю список файлов именно этих подпапок. Таким образом будет читаться содержимое только "Правильные" подпапки, а нехоршка пропускается.
#19 by rs_trade
если возможно, именовать папки так, что бы понятно было где искать, а что пропускать.
#20 by Torquader
а что VbScript.RegExp не поможет отличить Подпапка4 от всех остальных. Другое дело, что в директории с внешними формами хранить ещё кучу всего явно нехорошо.
#21 by Cthulhu
КомандаСистемы - dir - скинуть в какой надо файл в каком надо формате и пропарсить...
#22 by Vladal
Если может, то как? Я вот пока еще не нашел способ.
#23 by Vladal
Хороший вариант, был немного выше, оставил на закуску.
#24 by 1Сергей
ФС.АтрибутыФайла(<?>,,,,,,); не подходит?
#25 by FN
можешь взять сразу готовый список файлов:
#26 by Vladal
Атрибуты есть, я их читаю в первом проходе, когда собираю каталоги. Но беда, что ФС.НайтиСледующийФайл ищет всё. Так что самы быстрый вариант поперебору в парсинге dir
#27 by Ковычки
так ?
#28 by Vladal
Еще не рыл туда. Наверно, так. Спасибо. Сейчас приоритет задачи сменили, проверить пока не смогу, но на заметочку взял.
#29 by Vladal
Нашел еще один скрипт, который просматривает указанную папку и создаёт лог с именами файлов '*--------------------------------------------- '* Скрипт получения списка файлов '*--------------------------------------------- '* Programming by VerSys, 2008 '********************************************** Option Explicit ' 'Переменные и константы Public strPath      'Патч текущих диска, папки, подпапки Public strSeparator 'Строка-разделитель списка Public strSpace     'Строка с заданным количеством пробелов Public strBuffer    'Строка-накопитель сведений о папках, файлах Dim strFileName     'Имя файла отчета Const strHead = "Выберите диск или папку:" ' '-------------------------------------------------------------- 'Формируем диалоговое окно "Обзор папок" Set objShell = CreateObject("Shell.Application") 'Объект Shell     Set objDialogFolder = objShell.Namespace(&H11&)  'Name_Space = "Мой компьютер", Set objDialogFolderItem = objDialogFolder.Self   'и устанавливаем по умолчанию в диал.окне     strPath = objDialogFolderItem.Path ' 'Выводим диалоговое окно "Обзор папок" Set objFolder = objShell.BrowseForFolder(0,strHead,0,strPath) ' 'Если ничего не выбрано - завершаем скрипт       If objFolder Is Nothing Then End If ' 'Если пользователь выбрал диск или папку: ''получаем патч из диалога ' ''создаем File System Object  Set objFSO = CreateObject("Scripting.FileSystemObject") ' ''проверяем доступность указанного ресурса If objFSO.FolderExists(strPath) = False Then ' ''вызываем функцию прохода по каталогам и файлам  dhGetListFolderFile(strPath) ' ''Создаем файл отчета '''Формируем имя файла отчета как строка патча с заменой недопустимых символов    strFileName = strFileName & ".txt" '''Результат пишем в файл ' 'Сообщаем о создании отчета ' '-------------------------------------------------------------- ' FUNCTION'S Function dhGetListFolderFile(strFolderName) 'Функция прохода по каталогам и файлам Dim dFolder, dFile, dSubFolder   'получаем патч каталога    Set dFolder = objFSO.GetFolder(strFolderName)    'проходим файлы текущего каталога        strBuffer = strBuffer & strFolderName & " <DIR>" & vbNewLine    For Each dFile In dFolder.Files        strBuffer = strBuffer & strSeparator & vbNewLine    'проходим рекурсивно по всем подкаталогам    For Each dSubFolder In dFolder.SubFolders        dhGetListFolderFile(dSubFolder.Path)    Next End Function
Тэги: 1С 7.7 и ранее
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С