Wyszukiwanie pliku w ukrytym katalogu Delphi

0

Witam, potrzebuję znaleźć plik znajdujący się w katalogu domowym użytkownika w C:\Users\Marcin\AppData\Roaming\ - katalog AppData\Roaming\ jest katalogiem z atrybutem hiden. Na stronie 4programmers.net znalazłem kilka linijek kodu który sprawnie i bezbłędnie wyszukuje pliki, ale w przeszukiwaniu nie uwzględnia katalogów z atrybutem hiden. Czy możecie mi pomóc w rozwiązaniu tego problemu. Poniżej ten kod co wyszukuje:

procedure TForm1.FileSearch(const PathName, FileName : string; const InDir : boolean);
var Rec : TSearchRec;
 Path, CurFile, AllFiles : string;
 i: integer;
begin
Path := IncludeTrailingBackslash(PathName);
AllFiles:=FileName;
while AllFiles<>'' do begin
i:=pos(';', AllFiles);
if i=0 then begin
  CurFile:=Trim(AllFiles);
  AllFiles:='';
end else begin
  CurFile:=Trim(Copy(AllFiles, 1, i-1));
  Delete(AllFiles, 1, i);
end;
if FindFirst(Path + CurFile, faAnyFile, Rec) = 0 then
try
  repeat
   ListBox1.Items.Add(Path + Rec.name);
  until FindNext(Rec) <> 0;
finally
  FindClose(Rec);
end;
end; 
 
if not InDir then Exit;
 
if FindFirst(Path + '*.*', faDirectory, Rec) = 0 then 
try
repeat 
if { (Rec.Attr and faDirectory) and } (Rec.name <> '.') and (Rec.name <> '..') then 
  FileSearch(Path + Rec.name, FileName, True);
until FindNext(Rec) <> 0; 
finally 
FindClose(Rec);
end; 
end;

Kod wywołujący wyszukiwanie pliku:

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
ListBox1.Clear;
FileSearch(Edit1.Text,Edit2.Text, CheckBox1.State in [cbChecked]);
end;

dodanie znaczników <code class="delphi"> - Furious Programming

1

Sformatuj kod i wklej go w odpowiednie znaczniki to ktoś spojrzy. Katalog %AppData% można uzyskać tak, jak poniżej. Kodem podobnym można uzyskać ściezki do innych tak zwanych folderów specjalnych. Jest to wersja ANSI, potrzebujesz UNICODE to zmień typy na WideString, WideChar, MAX_PATH * SizeOf(WideChar), a funkcje WinAPI na ich odpowiedniki z W na końcu.

//...
uses
  ShlObj;

function AddBackSlash(Path : string) : string;
begin
  Result := '';
  if Path <> '' then
  begin
    if Path[Length(Path)] <> '\' then
    begin
      Result := Path + '\';
    end
    else
    begin
      Result := Path;
    end;
  end;
end;

function GetAppDataDirectory : string;
var
  Pidl : PItemIDList;
  Folder : array[0..MAX_PATH] of Char;
begin
  SHGetSpecialFolderLocation(0, CSIDL_APPDATA, Pidl);
  SHGetPathFromIDList(PIDL, Folder);
  Result := AddBackSlash(Folder);
end;

Natomiast wyszukiwanie pliku dokonaj funkcjami WinAPI. Nie ma wtedy problemu z fsAnyFile pod starszymi IDE, jak Delphi 7. Nie ma też problemu z zauważeniem przez funkcje plików czy katalogów ukrytych. Przenalizuj sobie kod dołączony do tego posta. To jest czyste WinAPI. i oczywiście można to zrobić pewnie inaczej. Ale ja kiedyś tak to zakodowałem dla jednego gościa. Oczywiście folder ukryty, jak widzisz jest kopiowany, ale jeżeli chciałbyś nadawać mu atrybuty jakie miał po przekopiowaniu to trzeba by było dopracować kod. Ale to już zrób sam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1