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

Вниз

Поиск файлов "Win+F" <> "FindFirst" <> "FindFirstFile"   Найти похожие ветки 

 
Sun bittern ©   (2005-11-30 20:12) [0]

День добрый!
Задался вопросом. Почему не соответсвует количество найденых файлов и папок различными методами?

Ищем стандартным поисковиком виндов файлы по масте "C:\*.*" - включая подкаталоги.

1. Средствами Windows у меня нашла 20279 файлов и папок
2. Популярная версия из FAQ где испоьзуется FindFirst - 12092 файлов и папок
3. Используя "FindFirstFile" вместо "FindFirst" было найдено - 19551 файлов и папок
4. Total Comander обнаружил - 19550 файлов и папок
5. Frigate 3 обнаружил - 19551 файлов и папок

Вопрос, чего же еще такого находит виндозный поиск?
20279 - 19551 = 728.
Т.е. получается находит еще каких-то 728  файлов или папок.
А может это и не файлы с папками???

Ваши мысли, мастера ;)


 
Anatoly Podgoretsky ©   (2005-11-30 20:19) [1]

Тут курить надо


 
begin...end ©   (2005-11-30 20:20) [2]

У нас не курят


 
DrPass ©   (2005-11-30 20:21) [3]

Налицо влияние энтропийных полей на основной раздел жесткого диска


 
Anatoly Podgoretsky ©   (2005-11-30 20:22) [4]

begin...end ©   (30.11.05 20:20) [2]
Вот потому такие результаты и получают, и чем меньне не курят, тем больше потери.


 
TUser ©   (2005-11-30 20:46) [5]

Может скрытые файлы и папки не увидеть. FAR еще любит в корзинке поискать.


 
Sun bittern ©   (2005-11-30 20:59) [6]

Anatoly Podgoretsky ©   (30.11.05 20:22) [4]

Да, накосячил я очень с FindFirst :(
Разобрался, упустил кое чего из кода.

А, разница  в результатх, у винды и файловых менеджерах наверно потому, что каждый свои атрибуты поиска по умолчанию использует.


 
Anatoly Podgoretsky ©   (2005-11-30 21:03) [7]

Есть одна особенность, которая отсутствует в FAQ
Набор аттрибутов на NTFS шире, чем описаный в Дельфи.


 
Sun bittern ©   (2005-11-30 21:57) [8]

Про дополнительные атрибуты NTFS впринципе в курсе. Еще раз перепроверил. Где накосячил, не вижу. У FindFirst результат реально меньше.
Поиск с одинаковыми атрибутами:

const
 DefaultAttr = faReadOnly or faHidden or faSysFile;

procedure FindFiles(APath, FFileName: String; SubDir: Boolean);
var
 FSearchRec,
 DSearchRec: TSearchRec;
 FindResult: integer;

 function IsDirNotation(ADirName: String): Boolean;
 begin
   Result := (ADirName = ".") or (ADirName = "..");
 end;

begin
 APath := IncludeTrailingPathDelimiter(APath);
 FindResult := FindFirst(APath + FFileName, DefaultAttr, FSearchRec);
 try
   while FindResult = 0 do
   begin
     Form1.ListBox1.Items.Add(LowerCase(APath+FSearchRec.Name));
     FindResult := FindNext(FSearchRec);
   end;

   FindResult := FindFirst(APath+"*.*", faDirectory, DSearchRec);

   if SubDir then
   while FindResult = 0 do
   begin
     if ((DSearchRec.Attr and faDirectory) = faDirectory) and not IsDirNotation(DSearchRec.Name) then
       FindFiles(APath+DSearchRec.Name, FFileName, SubDir);
     FindResult := FindNext(DSearchRec);
   end;
 finally
   FindClose(FSearchRec);
   FindClose(DSearchRec);
 end;
end;


 
Sun bittern ©   (2005-11-30 21:58) [9]

procedure FindFileMask(APath, AFileMask: String; const ASubDir: Boolean = True);
 var
   FSearchRec, DSearchRec: _WIN32_FIND_DATAA;
   FileHandle, DirHandle: Cardinal;

 function IsDirNotation(ADirName: String): Boolean;
 begin
   Result := (ADirName = ".") or (ADirName = "..");
 end;

begin
 DirHandle := 0;
 FileHandle := 0;
 APath := IncludeTrailingPathDelimiter(APath);
 FillChar(FSearchRec, SizeOf(_WIN32_FIND_DATAA), #0);
 FillChar(DSearchRec, SizeOf(_WIN32_FIND_DATAA), #0);
 FSearchRec.dwFileAttributes := DefaultAttr;
 FileHandle := FindFirstFile(PChar(APath + AFileMask), FSearchRec);
 try
   while FileHandle <> INVALID_HANDLE_VALUE do
   begin
     Form1.ListBox1.Items.Add(FSearchRec.cFileName);
     if not FindNextFile(FileHandle, FSearchRec) then BREAK;
   end;

 if ASubDir then
 begin
   DirHandle := FindFirstFile(PChar(APath + "*.*"), DSearchRec);
   while DirHandle <> INVALID_HANDLE_VALUE do
   begin
     if ((DSearchRec.dwFileAttributes and faDirectory) = faDirectory) and not IsDirNotation(DSearchRec.cFileName) then
       FindFileMask(APath + DSearchRec.cFileName, AFileMask, ASubDir);
     if not FindNextFile(DirHandle, DSearchRec) then BREAK;
   end;
 end;
 finally
   Windows.FindClose(FileHandle);
   Windows.FindClose(DirHandle);
 end;
end;


 
Sun bittern ©   (2005-11-30 22:01) [10]

Вобщем первая процедурка

 ListBox1.Clear;
 FindFiles("C:\", "*.exe", True);
 Caption := IntToStr(ListBox1.Items.Count);

Результат 644 файла

Вторая процедурка

 ListBox1.Clear;
 FindFileMask("C:\", "*.exe", True);
 Caption := IntToStr(ListBox1.Items.Count);

Результат 1101 файла

:(
Торможу... Наверно


 
Anatoly Podgoretsky ©   (2005-11-30 22:12) [11]

Sun bittern ©   (30.11.05 22:01) [10]
Торможу... Наверно

Тормозишь конечно, в первом случае ты берешь только файлы с аттрибутами faReadOnly or faHidden or faSysFile;, а во втором все.
Ты даже не берешь с аттрибутом faArchive


 
Sun bittern ©   (2005-11-30 22:52) [12]

Anatoly Podgoretsky ©   (30.11.05 22:12) [11]

Благодарствую, за тычек носом.


 
Anatoly Podgoretsky ©   (2005-11-30 23:08) [13]

Посмотри реализацию FindFirst многое понятно станет. Там довольно хитрый алгоритм.

Но вот результаты могут отличаться от Win+F из-за дополнительных аттрибутов.



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

Форум: "Потрепаться";
Текущий архив: 2005.12.25;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.014 c
14-1133295820
Shopot
2005-11-29 23:23
2005.12.25
Где достать компоненты для работы с Com портом?


14-1133260981
DelphiN!
2005-11-29 13:43
2005.12.25
Одалела зараза!


2-1133939778
Daria
2005-12-07 10:16
2005.12.25
Дабовить запись в БД (Paradox)


14-1133418578
WondeRu
2005-12-01 09:29
2005.12.25
Белорусская ОС


14-1133791505
Санёк
2005-12-05 17:05
2005.12.25
Олимпиады по информатике.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский