Wyszukiwanie folderów oraz wyjątki i (pokazuje kropki)

0

Znaleziony kod, wyszukuje również pliki, a zmieniłem, aby tylko katalogi.
Wyszukuje również, pliki których nie chcę (poniżej) oraz ścieżkę typu: C:\Documents and Settings\TERA\Dane aplikacji\Projekt. oraz C:\Documents and Settings\TERA\Dane aplikacji\Projekt.. czyli dodaje kropki, na dole będzie plik Test.txt

  Found := FindFirst(GetSpecialFolderPath(CSIDL_APPDATA) + '\Projekt\*.*',faDirectory,Finder);
  AssignFile(myFile, 'Test.txt');
  ReWrite(myFile);
  while (Found = 0) do // dopóki liczba znalezionych obiektów nie będzie równa zero.
    begin
    if Finder.Name <> (PChar('_usernames') or PChar('Config.XML')) then
      WriteLn(myFile, GetSpecialFolderPath(CSIDL_APPDATA) + '\Projekt\' + Finder.Name);
    Found:=FindNext(Finder); // kontynuacja wyszukiwania
    end;
  FindClose(Finder);                                                            // zakończenie wyszukiwania.
  CloseFile(myFile);
  Append(myFile);                                                               // Reopen to append a final line to the file
  WriteLn(myFile, 'Final line added');                                          // Write this final line
  CloseFile(myFile);                                                            // Close the file

Test.txt

C:\Documents and Settings\TERA\Dane aplikacji\Projekt\.
C:\Documents and Settings\TERA\Dane aplikacji\Projekt\..
C:\Documents and Settings\TERA\Dane aplikacji\Projekt\appsetting
C:\Documents and Settings\TERA\Dane aplikacji\Projekt\updater
C:\Documents and Settings\TERA\Dane aplikacji\Projekt\replacer
C:\Documents and Settings\TERA\Dane aplikacji\Projekt\Config.ini
C:\Documents and Settings\TERA\Dane aplikacji\Projekt\_usernames
Final line added

// 2-ch ostatnich bez Final, powinno nie wyświetlać - 1wszy jest plikiem, 2gi jest folderem którego nie chcę.

0

Finder.Name <> (PChar('_usernames') or PChar('Config.XML'))

To nie jest polski, kompilator wykona operację or bitowo. Wychodzi nieczytanie tutoriali.

// 2-ch ostatnich bez Final, powinno nie wyświetlać - 1wszy jest plikiem, 2gi jest folderem którego nie chcę.

TSearchRec to nie tylko nazwa, może użyj właściwości katalogów (np. Size=0) żeby je wyselekcjonować.

1

Przeanalizuj sobie kod dołączonego modułu. Pisany pod kątem zastosowania w WinAPI, a napisany jako osobny moduł ponieważ korzysta z dynamicznych tablic, co nieco zwiększa rozmiar exeka po dołączeniu takiego modułu, wykorzystującego wspomniane tablice. Wyszukiwanie plików można również zrobić tak jak poniżej, bez tablic, przechwytując wyniki oraz postęp w odpowiednich procedurach. Poniższy kod pochodzi z modułu useful_winapi, który kiedys tutaj dołączałem w jednym z postów. Procedura działa jak widać rekurencyjnie. Poczytaj sobie na MSDNie o funkcjach FindFirstFile oraz FindNextFile oraz co może być zawarte w strukturze TWIN32FindData, w szczególności jakie są dostępne atrybuty i przerób sobie SAMODZIELNIE ten kod tak, aby wyszukiwał Tobie katalogi czy działał tak jak sobie zechcesz.

//...

interface

uses
  Windows;

//...

type
  TFileSearchOnFindProc = procedure(FoundFileName : string);
  TFileSearchProgressProc = procedure(CurrentSearchPath : string);

//...

procedure FileSearch(const PathName, FileName : string; const InDir : boolean;
  FileSearchOnFindProc : TFileSearchOnFindProc; FileSearchProgressProc : TFileSearchProgressProc);

implementation

procedure FileSearch(const PathName, FileName : string; const InDir : boolean;
  FileSearchOnFindProc : TFileSearchOnFindProc; FileSearchProgressProc : TFileSearchProgressProc);
var
  H : THandle;
  Path : string;
  WFD : TWIN32FindData;
begin
  Path := AddBackSlash(PathName);
  if @FileSearchProgressProc <> nil then
  begin
    FileSearchProgressProc(Path);
  end;
  H := Windows.FindFirstFile(PChar(Path + FileName), WFD);
  if H <> INVALID_HANDLE_VALUE then
  begin
    try
      repeat
        if (WFD.dwFileAttributes and FILE_ATTRIBUTE_ARCHIVE = FILE_ATTRIBUTE_ARCHIVE)
          or (WFD.dwFileAttributes and FILE_ATTRIBUTE_NORMAL = FILE_ATTRIBUTE_NORMAL) then
        begin
          if @FileSearchOnFindProc <> nil then
          begin
            FileSearchOnFindProc(Path + WFD.cFileName);
          end;
        end;
      until not FindNextFile(H, WFD);
    finally
      Windows.FindClose(H);
    end;
  end;
  if InDir then
  begin
    H := Windows.FindFirstFile(PChar(Path + '*.*'), WFD);
    if H <> INVALID_HANDLE_VALUE then
    begin
      try
        repeat
          if (WFD.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = FILE_ATTRIBUTE_DIRECTORY)
            and (Copy(WFD.cFileName, 1, 1) <> '.') and (WFD.cFileName <> '..') then
          begin
            FileSearch(Path + WFD.cFileName, FileName, True, FileSearchOnFindProc, FileSearchProgressProc);
          end;
        until not FindNextFile(H, WFD);
      finally
        Windows.FindClose(H);
      end;
    end;
  end;
end;
//...
end.
1
s:=GetSpecialFolderPath(CSIDL_APPDATA) + '\Projekt\';
Found := FindFirst(s+'*.*',faAnyFile,Finder);
//...
if ((Finder.Attr and faDirectory) = faDirectory) and (Finder.Name <> '_usernames') then
      WriteLn(myFile, s + Finder.Name);
//...

"C:\Documents and Settings\TERA\Dane aplikacji\Projekt." oznacza bieżący katalog
"C:\Documents and Settings\TERA\Dane aplikacji\Projekt.." oznacza nadrzędny katalog

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