Форум: "Потрепаться";
Текущий архив: 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