Вверх ↑
Этот топик читают: Гость
Ответов: 2059
Рейтинг: 132
#1: 2016-05-26 15:51:17 ЛС | профиль | цитата
Подскажите пожалуйста, а то вот не знал, да забыл: - Есть-ли возможность прочитать из файловой системы (через API, или ещё как) количество файлов в той, или иной папке, учитывая все вложенные директории? Что-то типа GetDirectorySize, только по количеству файлов.
Даже подойдёт без вложенных папок - потом можно просуммировать.
Сейчас приходится делать обход всех вложенных папок с подсчётом файлов через компонент FileSearch, а это не быстро при больших объёмах.
В основном всё такие решения:
procedure GetAllFiles( Path: string; Lb: TListBox );
var
sRec: TSearchRec;
isFound: boolean;
begin
isFound := FindFirst( Path + ‘\*.*’, faAnyFile, sRec ) = 0;
while isFound do
begin
if ( sRec.Name <> ‘.’ ) and ( sRec.Name <> ‘..’ ) then
begin
if ( sRec.Attr and faDirectory ) = faDirectory then
GetAllFiles( Path + ‘\’ + sRec.Name, Lb );
Lb.Items.Add( Path + ‘\’ + sRec.Name );
end;
Application.ProcessMessages;
isFound := FindNext( sRec ) = 0;
end;
FindClose( sRec );
end;

через *.*
карма: 6

0
vip
#1.1контекстная реклама от партнеров
Разработчик
Ответов: 26067
Рейтинг: 2121
#2: 2016-05-26 16:36:16 ЛС | профиль | цитата
flint2 писал(а):
Есть-ли возможность прочитать из файловой системы

Только через FindFirst/FindNext
карма: 22

0
Ответов: 2059
Рейтинг: 132
#3: 2016-05-26 16:59:28 ЛС | профиль | цитата
nesco, спасибо! Развеял мои сомнения.
Чего-то сегодня во сне привиделось , что на диске, наряду с прочей информацией, в секторах хранится и такая информация.
карма: 6

0
Ответов: 5227
Рейтинг: 587
#4: 2016-05-26 21:21:40 ЛС | профиль | цитата
flint2 писал(а):
Сейчас приходится делать обход всех вложенных папок с подсчётом файлов через компонент FileSearch, а это не быстро при больших объёмах.


как вариант code_37297.txt
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
файлы: 1code_37297.txt [2.7KB] [518]
Разработчик
Ответов: 4697
Рейтинг: 426
#5: 2016-05-26 22:08:52 ЛС | профиль | цитата
flint2 писал(а):
что на диске, наряду с прочей информацией, в секторах хранится и такая информация.

На диске хранится бинарная инфа, а вот файловая система уже пользуется диском И в зависимости от реализации, может быть, действительно, чья-нибудь файловая система хранит подобные цифры.
карма: 10
0
Ответов: 2059
Рейтинг: 132
#6: 2016-05-26 23:30:56 ЛС | профиль | цитата

Assasin писал(а):
На диске хранится бинарная инфа, а вот файловая система уже пользуется диском

Разумеется.
Просто для краткости изложения, что интересуют решения не только на уровне ОС, но и драйверов к железу.
Чтобы не разводить словесную бодягу с MFT(Главная файловая таблица) в NTFS и..., или FAT-таблицами.
И в зависимости от реализации, может быть, действительно, чья-нибудь файловая система хранит подобные цифры.

На ранних Mac OS и Apple II в HFS - точно было, сам ковырял. Сейчас на HFS+ - не знаю.

andrestudio, Спасибо!
Вроде консольное пошустрей работает, но как это они делают?
Попробую украсить эту идею квадратиками, может чего и выйдет.


P.S.
Чего-то не стабильно работает. Наверное из-за того, что ей нужны короткие имена.
Постоянно ошибается с некоторыми директориями.


flint2 писал(а):
Вроде консольное пошустрей работает

Это я погорячился.
На каждую директорию выводит текстовую информацию из нескольких строк - от этого и тормоза.


P.S.

В NT есть ф-ция NtQueryDirectoryFile(...,OUT PVOID FileInformation,...);
которая возвращает в буфере FileInformation сразу все файлы (и папки) в заданной директории.
После этого достаточно пробежаться по буферу, чтобы например узнать количество файлов.
Для определения 197 тысяч файлов на диске X:\ обычным образом выполняется порядка 70 секунд, в то время как если использовать эту функцию, то количество файлов нарисуется секунды за 3-4.

Нашел NT DDK с примером на Си. Буду переводить на Delphi.
Продолжение следует.
карма: 6

0
Ответов: 5227
Рейтинг: 587
#7: 2016-05-27 09:16:23 ЛС | профиль | цитата
flint2, чисто для теста code_37299.txt сделано на простой рекурсии

p.s в нашем же деле что самое главное , ПоЧище Зая...Ся
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
файлы: 1code_37299.txt [876B] [438]
Ответов: 2059
Рейтинг: 132
#8: 2016-05-27 10:19:26 ЛС | профиль | цитата
andrestudio,
ПоЧище Зая...Ся



Чего-то у меня не хватает.
[url] http://forum.hiasm.net/forum_serv.php?q=56&id=4306 [/url]

карма: 6

0
Ответов: 5227
Рейтинг: 587
#9: 2016-05-27 11:23:29 ЛС | профиль | цитата
flint2, VBJScript UseName = True
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Ответов: 2059
Рейтинг: 132
#10: 2016-05-27 12:38:31 ЛС | профиль | цитата
Правильно я понимаю, что это настройки в системе?
Где? Не нашел.
А на другом компьютере тоже надо делать такие установки?


карма: 6

0
Разработчик
Ответов: 26067
Рейтинг: 2121
#11: 2016-05-27 12:47:16 ЛС | профиль | цитата
flint2 писал(а):
Где? Не нашел.

В свойствах компонента VBJScript
карма: 22

0
Ответов: 5227
Рейтинг: 587
#12: 2016-05-27 12:55:48 ЛС | профиль | цитата
flint2 писал(а):
Правильно я понимаю, что это настройки в системе?
нет, это настройка свойства компонента
У меня этот компонент уже модифицирован и этого свойства нет, тут модификация http://forum.hiasm.net/forum.html?q=3&p=285265#p285265 Но в твоём случае всё должно работать, у кого есть минута времени проверить проверьте а то есть непонятка по данному вопросу, code_37299 выше.

Скоро доделаю вызовQueryInterface и можно будет работать в скрипте с DirectX DirectShow и т.д
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Ответов: 16884
Рейтинг: 1239
#13: 2016-05-27 12:59:28 ЛС | профиль | цитата
flint2,
bat-файлом
chcp 1251
echo %date%; %time%; >filelist.txt
dir /s /d >>filelist.txt

получаем список всех файлов в выбранном каталоге
5-15 секунд на получение списка всех файлов папки Windows (~70 000 файлов)
Дальше - дело техники.
Подробнее здесь http://vellisa.ru/5-sposobov-poluchit-spisok-faylov
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 2059
Рейтинг: 132
#14: 2016-05-27 13:26:24 ЛС | профиль | цитата
Всем
Tad, andrestudio, nesco, спасибо.
Скоро отвечу, надо заправится.
[flood]Какую то водку "Стужа" взял, ходя и нежарко. [/flood]
Вроде домучил some_ntdef.pas из Си для использования в IC и т.д.
Работает архишустро. Надо на IC попробовать запустить. Пока только в Delphi попробовал.
function NtCreateFile; external ntdll name 'NtCreateFile';
function NtQueryDirectoryFile; external ntdll name 'NtQueryDirectoryFile';
function NtCreateEvent; external ntdll name 'NtCreateEvent';
function NtWaitForSingleObject; external ntdll name 'NtWaitForSingleObject';
procedure RtlInitUnicodeString; external ntdll name 'RtlInitUnicodeString';
function RtlUnicodeStringToAnsiString; external ntdll name 'RtlUnicodeStringToAnsiString';
to be continued...

карма: 6

0
Ответов: 16884
Рейтинг: 1239
#15: 2016-05-27 13:31:36 ЛС | профиль | цитата
flint2 писал(а):
надо заправится.
[flood]http://irecommend.ru/content/vodka-nemiroff-ukrainskaya-medovaya-s-pertsem
Лучше не бывает.[/flood]
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)