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

Вниз

Поиск файлов "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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.042 c
1-1133267416
AlexBurton
2005-11-29 15:30
2005.12.25
Необходимо защитить или зашифровать число от его изменения


2-1133791634
Квэнди
2005-12-05 17:07
2005.12.25
Проблемы с отправкой почты


6-1126760710
KLAUS
2005-09-15 09:05
2005.12.25
SMTP нужное кол-во раз


14-1133277729
Янис Прасол
2005-11-29 18:22
2005.12.25
Варианты решения задачи на проектирование UI


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