Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2007.08.19;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2007.08.19;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.042 c
1-1181216305
bss
2007-06-07 15:38
2007.08.19
Как добавить в начало xml-файла строку типа <?xml version?>


6-1168162326
_darksidenv
2007-01-07 12:32
2007.08.19
Winsock API и accept


2-1185266383
Th
2007-07-24 12:39
2007.08.19
Как узнать что пользователь залогинился в системе?


2-1185397616
SSSS
2007-07-26 01:06
2007.08.19
Проиграть файл из интернета...


2-1185122153
Elerond
2007-07-22 20:35
2007.08.19
программа в трее





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский