Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi probleme mit FindallFiles... (https://www.delphipraxis.net/147309-probleme-mit-findallfiles.html)

seppi.tm 5. Feb 2010 13:07


probleme mit FindallFiles...
 
Hallo,
ich habe mir diese funktion gekrallt(bisschen gemodded (Provisorisch)):
Delphi-Quellcode:

function FindAllFiles(RootFolder: string; Mask: string = '*.*'; Recurse: Boolean
  = True): TStringDynArray;
var
  wfd         : TWin32FindData;
  hFile       : THandle;
begin
  if AnsiLastChar(RootFolder)^ <> '\' then
    RootFolder := RootFolder + '\';
  if Recurse then
  begin
    hFile := FindFirstFile(PChar(RootFolder + '*.*'), wfd);
    if hFile <> INVALID_HANDLE_VALUE then
    try
      repeat
        if wfd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY =
          FILE_ATTRIBUTE_DIRECTORY then
          if (string(wfd.cFileName) <> '.') and (string(wfd.cFileName) <> '..')
            then
            FindAllFiles(RootFolder + wfd.cFileName, Mask, Recurse);
      until FindNextFile(hFile, wfd) = False;
    finally
      windows.FindClose(hFile);
    end;
  end;
  hFile := FindFirstFile(PChar(RootFolder + '*.*'), wfd);
  if hFile <> INVALID_HANDLE_VALUE then
  try
    repeat
      if wfd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY <>
        FILE_ATTRIBUTE_DIRECTORY then
      begin
        FileCount := length(Files)+1;
        Setlength(Files, FileCount);
        Files[FileCount - 1] := RootFolder + String(wfd.cFileName) + #09#09#09#09#09 + inttostr(GetFileSize(RootFolder + String(wfd.cFileName)));
      end
      else begin
       FileCount := length(Files)+1;
        Setlength(Files, FileCount);
        Files[FileCount - 1] := RootFolder + String(wfd.cFileName) + #09#09#09#09#09 +'FOLDER';
      end;
    until FindNextFile(hFile, wfd) = False;
  finally
    Windows.FindClose(hFile);
  end;
end;
so, das geht alles eig. wunderbar doch wenn ich auf einen ordner innerhalb von C:\Dokumente und Einstellungen oder auf einer anderen Partition zugreifen will gibt mir die funktion nichts zurück... wieso?

ich benutze windows XD sp2 und rufe diese funktion in einer dll auf.

p80286 5. Feb 2010 14:46

Re: probleme mit FindallFiles...
 
Und wie sieht die FindFirstFile aus?
vor allem, welche Attribute werden übergeben?

Gruß
K-H

himitsu 5. Feb 2010 15:01

Re: probleme mit FindallFiles...
 
MSDN-Library durchsuchenFindFirstFile

Und ich wüste nicht, warum es nicht warum es nicht funktionieren sollte.
Jedenfalls hab ich mit diesen Verzeichnissen keine Probleme.

p80286 5. Feb 2010 15:14

Re: probleme mit FindallFiles...
 
Zitat:

Zitat von himitsu
MSDN-Library durchsuchenFindFirstFile

Und ich wüste nicht, warum es nicht warum es nicht funktionieren sollte.
Jedenfalls hab ich mit diesen Verzeichnissen keine Probleme.

An das FindFirstFile hab ich mal wieder nicht gedacht. Trotzdem wenn da etwas "versteckt" ist, dann müssen die Attribute stimmen, und ich seh nirgendwo, das die Attribute gesetzt werden.

Gruß
K-H

himitsu 5. Feb 2010 16:03

Re: probleme mit FindallFiles...
 
Zitat:

Zitat von p80286
und ich seh nirgendwo, das die Attribute gesetzt werden.

Meinst du wfd.dwFileAttributes ?

Dieses wird von FindFirstFile oder FindNextFile gesetzt.

p80286 5. Feb 2010 16:28

Re: probleme mit FindallFiles...
 
Jo ich hab mir gereade FindFirst angeschaut, da ist es nötig,
bei FindFirstFile nicht.
Da gibt es nur den Hinweis auf die fehlenden Zugriffsrechte.

Gruß
K-H

Nachtrag:
von welchem Himmel fallen eigentlich Files und Filecount und wo bleibt Result? oder steckt das implizit in TDynStringarray ?

Astat 5. Feb 2010 20:08

Re: probleme mit FindallFiles...
 
Zitat:

Zitat von seppi.tm
..so, das geht alles eig. wunderbar doch wenn ich auf einen ordner innerhalb von C:\Dokumente und Einstellungen oder auf einer anderen Partition zugreifen will gibt mir die funktion nichts zurück... wieso?

Hallo seppi.tm, kannst ja mal mit unten stehender procedure vergleichen, funkt bei mir problemlos.


Delphi-Quellcode:

type
  TWin32FindDataCallback = procedure(const AFile: string); stdcall;

procedure FindFiles(const Dir: String; lpfnCallBack: TWin32FindDataCallback);
var
  hFind: THandle;
  wfd: TWin32FindData;
  sFileName: String;

  function IsDirectory(const Name: String): Boolean;
  var
    Atr: DWORD;
  begin
    Atr := GetFileAttributes(PChar(Name));
    Result := (Atr <> $FFFFFFFF) and (Atr and $010 <> 0) and (Atr and $400 = 0);
  end;

  function AddBackslash(const s: String): String;
  begin
    if (s <> '') and (s[Length(s)] <> '\') then
      Result := s + '\' else Result := s;
  end;

begin
  if (Dir <> '') and (Pos(#0, Dir) = 0) and IsDirectory(Dir) then begin
    hFind := FindFirstFile(PChar(AddBackslash(Dir) + '*'), wfd);
    if hFind <> DWORD(-1) then begin
      repeat
        if (StrComp(wfd.cFileName, '.') <> 0) and
          (StrComp(wfd.cFileName, '..') <> 0) then
        begin
          sFileName := AddBackslash(Dir) + wfd.cFileName;
          if wfd.dwFileAttributes and $10 = 0 then lpfnCallBack(sFileName) else
            FindFiles(sFileName, lpfnCallBack);
        end;
      until not FindNextFile(hFind, wfd);
      Windows.FindClose(hFind);
    end;
  end;
end;

procedure Win32FindDataCallback(const AFile: string); stdcall;
begin
  Form1.Memo1.Lines.Add(AFile)
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  FindFiles('C:\Dokumente und Einstellungen', Win32FindDataCallback);
end;
lg. Astat


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz