Co do problemu nr 2, to użycie:
FindFirst('*.*', $FFFFFFFF, SearchRec);
jest wyjściem poza zakres.
Natomiast w innym rozwiązaniu piszą, aby zastosować:
FindFirst('*.*', faAnyFile or $00000080, SearchRec);
co w rzeczywistości nie przynosi poprawy...choć mogę się mylić.
Natomiast problem nr 1 rozwiązałem następująco:
private
procedure ZnajdzPlik(Sciezka: String; Filtry: TStringList);
var
Form1: TForm1;
ListaWynikow: TStringList;
procedure TForm1.ZnajdzPlik(Sciezka: String; Filtry: TStringList);
var
i: SmallInt;
j: Byte;
VerifMask: TMask;
Poprawne: Boolean;
SR1, SR2: TSearchRec;
begin
if Sciezka[Length(Sciezka)] <> '\' then Sciezka := Sciezka + '\';
i := FindFirst(Sciezka + '*.*', faAnyFile, SR1);
try
while i = 0 do
begin
Application.ProcessMessages;
if ((SR1.Attr and faDirectory) = 0) and (SR1.Name <> '.') and (SR1.Name <> '..') then
begin
for j := 0 to Filtry.Count-1 do
begin
VerifMask := TMask.Create(Filtry.Strings[j]);
Poprawne := VerifMask.Matches(SR1.Name);
VerifMask.Free;
if Poprawne and (ListaWynikow.IndexOf(Sciezka + SR1.Name) = -1) then ListaWynikow.Add(Sciezka + SR1.Name);
Break;
end;
end;
i := FindNext(SR1);
end;
{Szukanie w podfolderach}
i := FindFirst(Sciezka + '*.*', faDirectory + faHidden, SR2);
while i = 0 do
begin
if ((SR2.Attr and faDirectory) = faDirectory) and (SR2.Name <> '.') and (SR2.Name <> '..') then
if Pos('\winsxs', Sciezka + SR2.Name) = 0 then ZnajdzPlik(Sciezka + SR2.Name, Filtry);
i := FindNext(SR2);
end;
finally
FindClose(SR1);
FindClose(SR2);
end;
end;
//Wywołanie:
var
ListaFiltrow: TStringList;
begin
ListaFiltrow := TStringList.Create;
ListaWynikow := TStringList.Create;
ListaFiltrow.Add('*.exe');
ListaFiltrow.Add('*.dll');
ZnajdzPlik('C:\', ListaFiltrow);
ListaFiltrow.Free;
//--> odczytaj listę wyników z
//ListaWynikow
ListaWynikow.Free;
end;
Szczególnie proszę zwrócić uwagę na:
i := FindFirst(Sciezka + '*.*', faDirectory + faHidden, SR2);
W takiej modyfikacji, zarówno pliki jak i foldery ukryte są znajdywane (szczególnie w Windows 7 dotyczy to folderu: C:\Users<uzytkownik>\AppData\ ).
Dalej nie rozumiem natomiast co ma wspólnego aplikacja 32-bitowa na systemie 32-bitowym z funkcjami:
Wow64DisableWow64FsRedirection
Wow64RevertWow64FsRedirection
i czy rzeczywiście te funkcje trzeba wywołać na systemie 64-bitowym.
Jeśli tak to jak ? bo przecież nie są to znane funkcje.