Быстрое чтение состава каталога на диске

1. const000 88 05.07.18 17:34 Сейчас в теме
Добрый день.

Вот вопрос возник - нужно прочитать состав каталога со всеми подчиненными, причем сделать это быстро. Файлов МНОГО.
Естественно первый лобовой метод -
	НайденныеФайлы = НайтиФайлы(Адрес, "*.*");
	Для Каждого Файл Из НайденныеФайлы Цикл
		Попытка
			Если Файл.ЭтоФайл() Тогда 
				Стр=ТабФайлов.Добавить();
				Стр.ДатаВремя=Файл.ПолучитьВремяИзменения();
				Стр.Длина=Файл.Размер();
				Стр.ПутьОригинальный=Файл.ПолноеИмя;
			Иначе
				ЗаполнитьРекурсивно (Адрес+"\"+Файл.Имя,Тип,Глубина+1,Режем,Префикс);
			КонецЕсли;
		Исключение
			Сообщить (""+ОписаниеОшибки());
			Возврат Ложь;
		КонецПопытки; 
	КонецЦикла;
Показать


Работает. Но м-е-е-е-е-е-дленнно... Все время занимает чтение имени, времени и размера.
Банальный батник 2.bat в текстовый файл выкидывает раз в 5 быстрее практически то же самое:
@for /D %%i IN (%1\*.*) do @(@dir "%%i"
			@call 2 "%%i") 


Сравнение времени - час и 5 минут. Причем кэш системы почти не влияет, проверял.
Конечно можно поанализировать выгрузку текстового файла, но как-то неправильно это.
Кто решал подобное? Может есть решение красивее? Не в параллельность и не на сервере - серверный пользователь никогда не будет иметь достаточных прав для чтения файлов.
По теме из базы знаний
Найденные решения
6. spacecraft 12.07.18 19:20 Сейчас в теме
(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. spacecraft 12.07.18 19:20 Сейчас в теме
(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;
	КонецЦикла;
	
КонецПроцедуры
Показать
9. const000 88 26.07.18 10:44 Сейчас в теме
(6) О! Я думал ветка уже скисла )
Посмотрел скорость.
Судя по всему это то же самое, что и 1с вызывает. Через Dir вышло в несколько раз быстрее - 1 200 000 за 10 примерно минут

Команда="dir /S """+Источник+""" > "+ИмяФайла+" ";
КомандаСистемы(Команда, КаталогВременныхФайлов());

и дальше прочесть текстовый вывод.
2. Timur.V 78 06.07.18 00:35 Сейчас в теме
Так результат батника можно записать в файл и открыть. И все это из 1с.
КомандаСистемы()
ЗапуститьПриложение()
3. const000 88 06.07.18 09:55 Сейчас в теме
(2) Так и сделал. Но как-то некрасиво... Временный файл, чтение через хз что... Неужели api нет?
4. mad375 06.07.18 11:26 Сейчас в теме
(3)Через COM средствами системы,не?
5. const000 88 12.07.18 18:24 Сейчас в теме
(4) Да, правильно. Но КАК? Не специалист я по СОМ...
7. mad375 13.07.18 07:35 Сейчас в теме
8. spacecraft 13.07.18 08:04 Сейчас в теме
(7) все относительно.
Обычный диск ( не SSD).
папок = 109 606; файлов = 664 093; время выполнения = 12 минут.
10. const000 88 26.07.18 10:46 Сейчас в теме
(7) Нет. самый быстрый вариант:
Команда="dir /S """+Источник+""" > "+ИмяФайла+" ";
КомандаСистемы(Команда, КаталогВременныхФайлов());

и дальше прочесть текстовый вывод.
1 200 000 за 10 примерно минут. Задержка уже на сервере происходит только.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот