![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как БЫСТРО подсчитать кол-во файлов в заданном каталоге? [D5, Win2k, WinXP]
Unknown user © (2007-02-26 15:54:00)Файлов может быть >1000
DVM (2007-03-03 19:02:00) [1]
> просто так (28.02.07 15:57) [20]
> >>Чтоб не подвисало - отдельный поток + окно с прогрессом.
>
> интересно, как сделать прогресс если колво файлов неизвестно?
>
Вспомни как MS такое делает. Даже специальный прогресс придумали :)
homm (2007-03-03 13:18:00) [2]> какие еще будут мнения на этот счет? :) хотя судя по тому,
> что стандартное окно свойства файлов и папок при запуске
> всегда подсчитывает кол-во файлов и занимаемммое место,
> наверное таки идиоты :)
Это видимое. На самом деле большую часть времени читаются всякие дискрипторы безопасности, аттрибуты, прочее.
Unknown user (2007-03-03 12:50:00) [3]
> В данный момент уже известно количество файлов в данном
> каталоге и кто же мешает его записать в тот же ИНИ?
да, действительно можно так поступать. но это не полноценное решение .
> > судя по высказываниям более быстрого метода не имеется?
>
> > ок.
>
> Что-т мне так не кажется. виндовс не идиоты писали. ИМХО,
> гднить должно хранится.
какие еще будут мнения на этот счет? :) хотя судя по тому, что стандартное окно свойства файлов и папок при запуске всегда подсчитывает кол-во файлов и занимаемммое место, наверное таки идиоты :)
мне интересно, если NTFS есть некое подобие базы данных, то может там хранится кол-во записей-файлов в каждом каталоге дополнительно к различным аттрибутам безопасности и пр.
homm (2007-02-28 16:02:00) [4]> судя по высказываниям более быстрого метода не имеется?
> ок.
Что-т мне так не кажется. виндовс не идиоты писали. ИМХО, гднить должно хранится.
просто так (2007-02-28 15:57:00) [5]>>Чтоб не подвисало - отдельный поток + окно с прогрессом.
интересно, как сделать прогресс если колво файлов неизвестно?
DiamondShark (2007-02-28 12:49:00) [6]А у меня вообще сомнения в полезности листбокса с тысячью записей.
Alex Konshin (2007-02-28 08:51:00) [7]А почему решили, что время тратится на подсчет файлов?
Я уверен, что оно тратится на заполнение этого самого листбокса. Нужно просто блокировать отрисовку этого листбокса во время заполнения.
Anatoly Podgoretsky (2007-02-26 20:31:00) [8]> Unknown user (26.02.2007 17:06:10) [10]
> последний активный каталог запоминается в INI,
Вот оно ключевое слово!
В данный момент уже известно количество файлов в данном каталоге и кто же мешает его записать в тот же ИНИ?
Unknown user (2007-02-26 17:27:00) [9]DVM
спасибо.
судя по высказываниям более быстрого метода не имеется? ок. всем спасибо. буду передавать в в функцию значение при котром прекратить подсчет, мне то ведь надо только проверить или не больше число файлов в каталоге некоторого числа N, until (FindNextFile(FH,FD) = false) or StopCount. и действительно надо организовывать потоки для операций занимающих много машинного времени
Reindeer Moss Eater (2007-02-26 17:26:00) [10]подсчет 1750 файлов выполняет около 2-5 сек.
А зачем считать до конца?
Если подсчет уже длится дольше икс миллисекунд, то не проще ли просто сделать break из цикла?
clickmaker (2007-02-26 17:25:00) [11]
> [10] Unknown user © (26.02.07 17:06)
а почему бы не отказаться от FileListBox в пользу просто ListBox + FindFirst + отдельный поток? Или сразу читать, допустим, первые 300 файлов, показывать список, а потом уже в потоке (или с Application.ProcessMessages) тихонько дочитывать, пока юзер таращит глаза на такое изобилие
DVM (2007-02-26 17:20:00) [12]
> Unknown user © (26.02.07 17:06) [10]
Чтоб не подвисало - отдельный поток + окно с прогрессом.
DVM (2007-02-26 17:18:00) [13]function GetDirFilesCount(const Dir: string; const Mask: string): integer;
var
FD : TWin32FindData;
FH : THandle;
begin
Result := 0;
if (Dir = '') or (not DirExists(Dir)) then exit;
FH := FindFirstFile(PChar(Dir + Mask), FD);
repeat
if (FH<>INVALID_HANDLE_VALUE) and (FD.cFileName <> string('.')) and
(FD.cFileName<>string('..')) and ((FILE_ATTRIBUTE_HIDDEN and FD.dwFileAttributes) = 0) then
if (FILE_ATTRIBUTE_DIRECTORY and FD.dwFileAttributes) = 0 then inc(Result);
until FindNextFile(FH,FD) = false;
if FH <> 0 then Windows.FindClose(FH);
end;
Unknown user (2007-02-26 17:13:00) [14]Сергей М.
я и в ответе конкретно не упоминал :) я сказал, например, FAT32 потому что как организовано в NTFS не знаю, хотя судя по тому что эта FS имеет структуру подобную к базе данных, то такая инфа, как кол-во файлов в каталоге, в ней может и храниться.
Unknown user (2007-02-26 17:06:00) [15]Reindeer Moss Eater под самым быстрым способом неизвестные юзеры подразумевают алгоритм выполняющий данную задачу за наименьшее время среди всех известных алгоритмов.
поясняю подробнее: есть программа, в FileListBox в которой загружается список фалов, последний активный каталог запоминается в INI, чтобы при старте программы снова его выбрать. так вот, если в этом каталоге огромное кол-во файлов программа надолго подвисает при старте (время на заполнение FileListBox). поэтому при старте программы приходится проверять сколько файлов в каталоге который требуется выбрать и если это число больше определенного кол-ва, в данный каталог не переходить. тот способ что я использую сейчас (FindFirst, FindNext) подсчет 1750 файлов выполняет около 2-5 сек. (правда каталог сетевой)
Reindeer Moss Eater (2007-02-26 16:44:00) [16]Под самым быстрым способом неизвестные юзеры как правило подразумевают способ "с наименьшим количеством буков исходника".
ЗЫ самый быстрый способ : посылка какому-нибудь листбоксу LB_DIR и последующее чтение Items.Count
Сергей М. (2007-02-26 16:28:00) [17]
> например, для FAT32
А ты разве упомянул в вопросе конкретнуюфайловую систему ?
Сергей М. (2007-02-26 16:26:00) [18]
> Unknown user © (26.02.07 16:14) [5]
>
> на данный момент использую FindFirst, FindNext по маске
> *.*
ну и используй себе)... Чем же оно "медленно"-то ?
> интересно в самих фаловых таблицах хранится значение -кол-
> во файлов в каталоге?
Нет, не хранится.
Unknown user (2007-02-26 16:16:00) [19]интересно в самих фаловых таблицах хранится значение -кол-во файлов в каталоге? хотя насколько мне помнится, например, для FAT32 нет разницы между файлом и каталогом, только иной аттрибут.
Unknown user (2007-02-26 16:14:00) [20]на данный момент использую FindFirst, FindNext по маске *.*