Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как БЫСТРО подсчитать кол-во файлов в заданном каталоге? [D5, Win2k, WinXP]


Страницы:   1 2

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 по маске *.*


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо