Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.08.19;
Скачать: CL | DM;

Вниз

Как БЫСТРО подсчитать кол-во файлов в заданном каталоге?   Найти похожие ветки 

 
Unknown user ©   (2007-02-26 15:54) [0]

Файлов может быть >1000


 
Сергей М. ©   (2007-02-26 16:00) [1]

Встречный вопрос - МЕДЛЕННО это как ?


 
Unknown user ©   (2007-02-26 16:06) [2]

Утояняющий вопрос: какой самый быстрый способ?


 
Сергей М. ©   (2007-02-26 16:10) [3]


> какой самый быстрый способ?


Тот который не самый "медленный".

А уж что ты записал в "медленные способы"
- то нам неведомо.


 
clickmaker ©   (2007-02-26 16:14) [4]


> [2] Unknown user ©   (26.02.07 16:06)

а ты какой использовал?


 
Unknown user ©   (2007-02-26 16:14) [5]

на данный момент использую FindFirst, FindNext по маске *.*


 
Unknown user ©   (2007-02-26 16:16) [6]

интересно в самих фаловых таблицах хранится значение -кол-во файлов в каталоге? хотя насколько мне помнится, например, для FAT32 нет разницы между файлом и каталогом, только иной аттрибут.


 
Сергей М. ©   (2007-02-26 16:26) [7]


> Unknown user ©   (26.02.07 16:14) [5]
>
> на данный момент использую FindFirst, FindNext по маске
> *.*


ну и используй себе)... Чем же оно "медленно"-то ?


> интересно в самих фаловых таблицах хранится значение -кол-
> во файлов в каталоге?


Нет, не хранится.


 
Сергей М. ©   (2007-02-26 16:28) [8]


> например, для FAT32


А ты разве упомянул в вопросе конкретную файловую систему ?


 
Reindeer Moss Eater ©   (2007-02-26 16:44) [9]

Под самым быстрым способом неизвестные юзеры как правило подразумевают способ "с наименьшим количеством буков исходника".

ЗЫ самый быстрый способ : посылка какому-нибудь листбоксу LB_DIR и последующее чтение Items.Count


 
Unknown user ©   (2007-02-26 17:06) [10]

Reindeer Moss Eater под самым быстрым способом неизвестные юзеры подразумевают алгоритм выполняющий данную задачу за наименьшее время среди всех известных алгоритмов.

поясняю подробнее: есть программа, в FileListBox в которой загружается список фалов, последний активный каталог запоминается в INI, чтобы при старте программы снова его выбрать. так вот, если в этом каталоге огромное кол-во файлов программа надолго подвисает при старте (время на заполнение FileListBox). поэтому при старте программы приходится проверять сколько файлов в каталоге который требуется выбрать и если это число больше определенного кол-ва, в данный каталог не переходить. тот способ что я использую сейчас (FindFirst, FindNext) подсчет 1750 файлов выполняет около 2-5 сек. (правда каталог сетевой)


 
Unknown user ©   (2007-02-26 17:13) [11]

Сергей М.

я и в ответе конкретно не упоминал :) я сказал, например, FAT32 потому что как организовано в NTFS не знаю, хотя судя по тому что эта FS имеет структуру подобную к базе данных, то такая инфа, как кол-во файлов в каталоге, в ней может и храниться.


 
DVM ©   (2007-02-26 17:18) [12]

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;


 
DVM ©   (2007-02-26 17:20) [13]


> Unknown user ©   (26.02.07 17:06) [10]

Чтоб не подвисало - отдельный поток + окно с прогрессом.


 
clickmaker ©   (2007-02-26 17:25) [14]


> [10] Unknown user ©   (26.02.07 17:06)

а почему бы не отказаться от FileListBox в пользу просто ListBox + FindFirst + отдельный поток? Или сразу читать, допустим, первые 300 файлов, показывать список, а потом уже в потоке (или с Application.ProcessMessages) тихонько дочитывать, пока юзер таращит глаза на такое изобилие


 
Reindeer Moss Eater ©   (2007-02-26 17:26) [15]

подсчет 1750 файлов выполняет около 2-5 сек.

А зачем считать до конца?
Если подсчет уже длится дольше икс миллисекунд, то не проще ли просто сделать break из цикла?


 
Unknown user ©   (2007-02-26 17:27) [16]

DVM

спасибо.

судя по высказываниям более быстрого метода не имеется? ок. всем спасибо. буду передавать в в функцию значение при котром прекратить подсчет, мне то ведь надо только проверить или не больше число файлов в каталоге некоторого числа N, until (FindNextFile(FH,FD) = false) or StopCount. и действительно надо организовывать потоки для операций занимающих много машинного времени


 
Anatoly Podgoretsky ©   (2007-02-26 20:31) [17]

> Unknown user  (26.02.2007 17:06:10)  [10]

> последний активный каталог запоминается в INI,

Вот оно ключевое слово!
В данный момент уже известно количество файлов в данном каталоге и кто же мешает его записать в тот же ИНИ?


 
Alex Konshin ©   (2007-02-28 08:51) [18]

А почему решили, что время тратится на подсчет файлов?
Я уверен, что оно тратится на заполнение этого самого листбокса. Нужно просто блокировать отрисовку этого листбокса во время заполнения.


 
DiamondShark ©   (2007-02-28 12:49) [19]

А у меня вообще сомнения в полезности листбокса с тысячью записей.


 
просто так   (2007-02-28 15:57) [20]

>>Чтоб не подвисало - отдельный поток + окно с прогрессом.
интересно, как сделать прогресс если колво файлов неизвестно?


 
homm ©   (2007-02-28 16:02) [21]

> судя по высказываниям более быстрого метода не имеется?
> ок.

Что-т мне так не кажется. виндовс не идиоты писали. ИМХО, гднить должно хранится.


 
Unknown user ©   (2007-03-03 12:50) [22]


> В данный момент уже известно количество файлов в данном
> каталоге и кто же мешает его записать в тот же ИНИ?


да, действительно можно так поступать. но это не полноценное решение .


> > судя по высказываниям более быстрого метода не имеется?
>
> > ок.
>
> Что-т мне так не кажется. виндовс не идиоты писали. ИМХО,
>  гднить должно хранится.


какие еще будут мнения на этот счет? :) хотя судя по тому, что стандартное окно свойства файлов и папок при запуске всегда подсчитывает кол-во файлов и занимаемммое место, наверное таки идиоты :)

мне интересно, если NTFS есть некое подобие базы данных, то может там хранится кол-во записей-файлов в каждом каталоге дополнительно к различным аттрибутам безопасности и пр.


 
homm ©   (2007-03-03 13:18) [23]

> какие еще будут мнения на этот счет? :) хотя судя по тому,
> что стандартное окно свойства файлов и папок при запуске
> всегда подсчитывает кол-во файлов и занимаемммое место,
> наверное таки идиоты :)
Это видимое. На самом деле большую часть времени читаются всякие дискрипторы безопасности, аттрибуты, прочее.


 
DVM ©   (2007-03-03 19:02) [24]


> просто так   (28.02.07 15:57) [20]
> >>Чтоб не подвисало - отдельный поток + окно с прогрессом.
>
> интересно, как сделать прогресс если колво файлов неизвестно?
>

Вспомни как MS такое делает. Даже специальный прогресс придумали :)



Страницы: 1 вся ветка

Текущий архив: 2007.08.19;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.025 c
2-1185551580
winsproot
2007-07-27 19:53
2007.08.19
Как сделать скин для своёй программы????


5-1160128745
Alek_1
2006-10-06 13:59
2007.08.19
idSMTP


2-1185486308
временный Чайник
2007-07-27 01:45
2007.08.19
контейнер для хранения GIF


2-1184431306
..::KraN::..
2007-07-14 20:41
2007.08.19
Как убрать кнопку приложения с Панели Задач???


2-1185347898
Kolan
2007-07-25 11:18
2007.08.19
Чем работать с DBF файлами