Witam.
Poszukuję optymalnej procedury do "przekopywania" dysku w poszukiwaniu plików która zwracała by ścieżki do plików (i można ograniczyć się do danego rozszerzenia).
Dla czego mówię optymalna (jest pełno w google takich funkcji) bo te są zbyt wolne (windowsowy robi to szybciej)
Dlatego, że korzysta z indeksu, który cały czas aktualizuje.
Poza tym, przeszukiwanie dysku w poszukiwaniu tylko jednej maski jest szybkie.
Teoretycznie jest jeszcze możliwość bardzo szybkiego szukania na podstawie informacji z MFT partycji, ale tego nie wiem jak wykorzystać.
ja uzywam takien funkcji... znalazłem ją kiedyś w necie:
function FindFiles(const Path, Mask: string; IncludeSubDir: boolean): integer;
var
FindResult: integer;
SearchRec : TSearchRec;
begin
result := 0;
FindResult := FindFirst(Path + Mask, faAnyFile - faDirectory, SearchRec);
while FindResult = 0 do
begin
form1.scombobox9.Items.Add(path); { <<<<<<<<<<< tutaj wklepujesz co ma robić z znalezionym plikiem, w moim przypadku dodaje ścieżkę do cb }
result := result + 1;
FindResult := FindNext(SearchRec);
end;
FindClose(SearchRec);
if not IncludeSubDir then
Exit;
FindResult := FindFirst(Path + '*.*', faDirectory, SearchRec);
while FindResult = 0 do
begin
if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
result := result +
FindFiles (Path + SearchRec.Name + '\', Mask, TRUE);
FindResult := FindNext(SearchRec);
end;
FindClose(SearchRec);
end;
jak użyć? To proste:
FindFiles('C:\', '*.dat', true);
Przeszukiwanie dysku C w moim wypadku to 4-6 sek.
Minus funkcji? Szuka tylko w widocznych plikach.
Dodatkowo zwraca ilość znalezionych plików ^^
//edit
nazwe pliku pobierasz przez SearchRec.Name
Takie funkcje jak wyżej to jakieś dzieci piszą...
Prawdziwa funkcja szukająca jest zoptymalizowana, nie pracuje na komponentach wizualnych, szuka we wszystkich folderach (także z atrybutami ukrytymi) i odnajduje pliki według wielu parametrów:
- maski szukające pliki
- maski wykluczające pliki
- maski wykluczające foldery
- maski wykluczające atrybuty