Быстрое чтение состава каталога на диске
Добрый день.
Вот вопрос возник - нужно прочитать состав каталога со всеми подчиненными, причем сделать это быстро. Файлов МНОГО.
Естественно первый лобовой метод -
Работает. Но м-е-е-е-е-е-дленнно... Все время занимает чтение имени, времени и размера.
Банальный батник 2.bat в текстовый файл выкидывает раз в 5 быстрее практически то же самое:
Сравнение времени - час и 5 минут. Причем кэш системы почти не влияет, проверял.
Конечно можно поанализировать выгрузку текстового файла, но как-то неправильно это.
Кто решал подобное? Может есть решение красивее? Не в параллельность и не на сервере - серверный пользователь никогда не будет иметь достаточных прав для чтения файлов.
Вот вопрос возник - нужно прочитать состав каталога со всеми подчиненными, причем сделать это быстро. Файлов МНОГО.
Естественно первый лобовой метод -
НайденныеФайлы = НайтиФайлы(Адрес, "*.*");
Для Каждого Файл Из НайденныеФайлы Цикл
Попытка
Если Файл.ЭтоФайл() Тогда
Стр=ТабФайлов.Добавить();
Стр.ДатаВремя=Файл.ПолучитьВремяИзменения();
Стр.Длина=Файл.Размер();
Стр.ПутьОригинальный=Файл.ПолноеИмя;
Иначе
ЗаполнитьРекурсивно (Адрес+"\"+Файл.Имя,Тип,Глубина+1,Режем,Префикс);
КонецЕсли;
Исключение
Сообщить (""+ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
КонецЦикла;
ПоказатьРаботает. Но м-е-е-е-е-е-дленнно... Все время занимает чтение имени, времени и размера.
Банальный батник 2.bat в текстовый файл выкидывает раз в 5 быстрее практически то же самое:
@for /D %%i IN (%1\*.*) do @(@dir "%%i"
@call 2 "%%i")
Сравнение времени - час и 5 минут. Причем кэш системы почти не влияет, проверял.
Конечно можно поанализировать выгрузку текстового файла, но как-то неправильно это.
Кто решал подобное? Может есть решение красивее? Не в параллельность и не на сервере - серверный пользователь никогда не будет иметь достаточных прав для чтения файлов.
По теме из базы знаний
Найденные решения
(1) как то так:
Процедура ПолучитьИнформациюОФайлах(Путь)
ТабФайлов.Очистить();
ФСО = Новый COMОбъект("Scripting.FileSystemObject");
Folders = ФСО.GetFolder(Путь);
ЗаполнитьИнформациюПоФайлам(Folders.Files);
ОбходПодпапок(ФСО.GetFolder(Путь));
КонецПроцедуры
Функция ОбходПодпапок(Folder)
Для Каждого Subfolder Из Folder.SubFolders Цикл
ЗаполнитьИнформациюПоФайлам(Subfolder.Files);
ОбходПодпапок(Subfolder);
КонецЦикла;
КонецФункции
Процедура ЗаполнитьИнформациюПоФайлам(Files)
Перем Стр, файл;
Для Каждого файл Из Files Цикл
Стр = ТабФайлов.Добавить();
Стр.DateCreated = файл.DateCreated;
Стр.DateLastAccessed = файл.DateLastAccessed;
Стр.DateLastModified = файл.DateLastModified;
Стр.Name = файл.Name;
Стр.Path = файл.Path;
Стр.Size = файл.Size;
КонецЦикла;
КонецПроцедуры
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) как то так:
Процедура ПолучитьИнформациюОФайлах(Путь)
ТабФайлов.Очистить();
ФСО = Новый COMОбъект("Scripting.FileSystemObject");
Folders = ФСО.GetFolder(Путь);
ЗаполнитьИнформациюПоФайлам(Folders.Files);
ОбходПодпапок(ФСО.GetFolder(Путь));
КонецПроцедуры
Функция ОбходПодпапок(Folder)
Для Каждого Subfolder Из Folder.SubFolders Цикл
ЗаполнитьИнформациюПоФайлам(Subfolder.Files);
ОбходПодпапок(Subfolder);
КонецЦикла;
КонецФункции
Процедура ЗаполнитьИнформациюПоФайлам(Files)
Перем Стр, файл;
Для Каждого файл Из Files Цикл
Стр = ТабФайлов.Добавить();
Стр.DateCreated = файл.DateCreated;
Стр.DateLastAccessed = файл.DateLastAccessed;
Стр.DateLastModified = файл.DateLastModified;
Стр.Name = файл.Name;
Стр.Path = файл.Path;
Стр.Size = файл.Size;
КонецЦикла;
КонецПроцедуры
Показать
(6) О! Я думал ветка уже скисла )
Посмотрел скорость.
Судя по всему это то же самое, что и 1с вызывает. Через Dir вышло в несколько раз быстрее - 1 200 000 за 10 примерно минут
Команда="dir /S """+Источник+""" > "+ИмяФайла+" ";
КомандаСистемы(Команда, КаталогВременныхФайлов());
и дальше прочесть текстовый вывод.
Посмотрел скорость.
Судя по всему это то же самое, что и 1с вызывает. Через Dir вышло в несколько раз быстрее - 1 200 000 за 10 примерно минут
Команда="dir /S """+Источник+""" > "+ИмяФайла+" ";
КомандаСистемы(Команда, КаталогВременныхФайлов());
и дальше прочесть текстовый вывод.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот