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 FindFirstFile: Wie suche ich auch in Unterordnern? (https://www.delphipraxis.net/39462-findfirstfile-wie-suche-ich-auch-unterordnern.html)

Pseudemys Nelsoni 3. Feb 2005 05:36


FindFirstFile: Wie suche ich auch in Unterordnern?
 
siehe titel. Mit werden immer nur die dateien in dem hauptordner den ich der funktion übergebe angezeigt, nicht aber die dateien dessen unterordner. Wie mache ich das?

mirage228 3. Feb 2005 05:39

Re: FindFirstFile: Wie suche ich auch in Unterordnern?
 
Zitat:

Zitat von Pseudemys Nelsoni
siehe titel. Mit werden immer nur die dateien in dem hauptordner den ich der funktion übergebe angezeigt, nicht aber die dateien dessen unterordner. Wie mache ich das?

Hi,

da musst Du rekursiv alle Unterordner dursuchen.

Einen enstsprechenden Code findest Du in der Library. Du musst ihn nur geringfügig ändern (einfach ne Abfrage nach Deinem Dateinamen einbauen).

mfG
mirage228

Pseudemys Nelsoni 3. Feb 2005 06:04

Re: FindFirstFile: Wie suche ich auch in Unterordnern?
 
moin Mirage,

ich muss noch erwähnen das ich nicht die VCL version FindFirst meine, sondern die API funktion FindFirstFile und einen code finde ich in der cod lib nicht. ich weiss derzeit nicht wie ich überhaupt an die ordner komme.

mirage228 3. Feb 2005 06:24

Re: FindFirstFile: Wie suche ich auch in Unterordnern?
 
Hi,

hier ist der Code:
http://www.delphipraxis.net/internal...ect.php?t=2464

Das nach nonVCL umzubauen sollte aber kein Problem darstellen (hoffe ich :mrgreen: ) - im Prinzip ist beides das selbe.

mfG
mirage228

Pseudemys Nelsoni 3. Feb 2005 06:27

Re: FindFirstFile: Wie suche ich auch in Unterordnern?
 
hallo mirage,

leider hilft mir das nicht :oops: FindFirst hat da einen parameter den ich bei FindFirstFile nicht habe und zwar:

Zitat:

if FindFirst(RootFolder + '*.*', faAnyFile, SR) = 0 then

kalmi01 3. Feb 2005 06:54

Re: FindFirstFile: Wie suche ich auch in Unterordnern?
 
Hi,
so kann man es machen, läuft mit ShellAPI:
Delphi-Quellcode:
  interface
    procedure DirSearch(SearchDir,  SearchFile : string;
                        var DirList, FileList  : TStringList);


  implementation
    procedure DirSearch(SearchDir,  SearchFile : string;
                        var DirList, FileList  : TStringList);
      var
        i        : Integer;
        SearchRec : TSearchRec;
      begin
        if SearchDir[Length(SearchDir)] <> '\' then SearchDir := SearchDir + '\';
        i := FindFirst(SearchDir + SearchFile, faDirectory, SearchRec);

        if DirectoryExists(SearchDir)
        then DirList.Add(Copy(SearchDir, 0, Length(SearchDir) -1));

        while i = 0
        do begin
             if (SearchRec.Name <> '.')
                and
                (SearchRec.Name <> '..')
             then begin
                    if DirectoryExists(SearchDir + SearchRec.Name)
                    then DirList.Add(SearchDir + SearchRec.Name);

                    if FileExists(SearchDir + SearchRec.Name)
                    then FileList.Add(SearchDir + SearchRec.Name);

                    SearchRec.Name := SearchDir + SearchRec.Name;
                    DirSearch(SearchRec.Name, SearchFile, DirList, FileList);
                  end;

             i := FindNext(SearchRec);
           end;
        FindClose(SearchRec);
      end;
Der Parameter fa.... gibt den Filetyp an, also z.B. alle Files (faAnyFile) oder nur Dir's (faDirectory).

Ich hoffe geholfen zu haben.
Gruß Michael

Pseudemys Nelsoni 3. Feb 2005 08:44

Re: FindFirstFile: Wie suche ich auch in Unterordnern?
 
hallo karmi,

die shellapi wollte ich eigentlich weglassen (hoffe du hast den code nicht extra geschrieben), sonst danke auf jeden fall :thumb:

Nur wie gesagt wollte ich die unit weglassen....ich dachte wie gesagt das FindFirstFile irgendwie auch unterverzeichnisse mit einbeziehen kann...aber scheint wohl nicht so.... gibt es denn sonst eine funktion um unterordner eines ordners in eine list zu bekommen oder so?
Ich möchte nämlich in einem verzeichnis(+ unterverzeichnisse) alle dateien anzeigen die die endung *.txt haben

Luckie 3. Feb 2005 09:37

Re: FindFirstFile: Wie suche ich auch in Unterordnern?
 
das geht mit FindeFirstFile genauso, wie mit FindFirst aus der Code-Lib. Und das umzuschreiben sollte kein Problem sein. FindFirst, FindNext durch FindFirstFile und FindnextFile ersetzen, Parameter anpassen und die eben den Rückgabewert der API-Funktionen auswerten.

Ich habe es mal schnell umgeschrieben:
Delphi-Quellcode:
procedure FindAllFiles(var FileList: TStrings; RootFolder: string; Mask: string =
  '*.*'; Recurse: Boolean = True);
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(FileList, 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
        FileList.Add(RootFolder + wfd.cFileName);
      end;
    until FindNextFile(hFile, wfd) = False;
  finally
    Windows.FindClose(hFile);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  sl: TStrings;
begin
  sl := TStringList.Create;
  try
    FindAllFiles(sl, 'd:\', '*.*', True);
    ListBox1.Items := sl;
  finally
    sl.Free;
  end;
end;
Die TStrings wirst du mit einem dynamischen String Array los, aber das solltest du selber hinbekommen.

MathiasSimmack 3. Feb 2005 10:05

Re: FindFirstFile: Wie suche ich auch in Unterordnern?
 
Zitat:

Zitat von Pseudemys Nelsoni
die shellapi wollte ich eigentlich weglassen

Warum eigentlich? Die ShellAPI vergrößert dein Programm nicht bzw. unwesentlich. :)

Muetze1 3. Feb 2005 10:13

Re: FindFirstFile: Wie suche ich auch in Unterordnern?
 
Moin!

Zitat:

Zitat von Pseudemys Nelsoni
ich dachte wie gesagt das FindFirstFile irgendwie auch unterverzeichnisse mit einbeziehen kann...aber scheint wohl nicht so....

Einfach in dem Unterverzeichnis erneut suchen mit FindFirstFile() - es wurde doch nun schon mehrfach drauf hingewiesen das du es selber rekursiv machen musst. Vor allem: Warum sollte Windows eine solche Funktion anbieten?

MfG
Muetze1

Luckie 3. Feb 2005 10:23

Re: FindFirstFile: Wie suche ich auch in Unterordnern?
 
Und jetzt das ganze noch ohne TStrings und somit ohne die Unit Classes.pas:
Delphi-Quellcode:
type
  TStringDynArray = array of string;

var
  FileCount: Cardinal = 0;
  Files  : TStringDynArray = nil;

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);
      end;
    until FindNextFile(hFile, wfd) = False;
  finally
    Windows.FindClose(hFile);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i           : Integer;
begin
  Files := nil;
  FindAllFiles('d:\Dokumente', '*.*', True);
  for i := 0 to length(Files) - 1 do
  begin
    Listbox1.Items.Add(Files[i]);
  end;
end;

Kernel32.DLL 3. Feb 2005 10:29

Re: FindFirstFile: Wie suche ich auch in Unterordnern?
 
Die Prozedur kommt ja wie gerufen...

Pseudemys Nelsoni 4. Feb 2005 12:58

Re: FindFirstFile: Wie suche ich auch in Unterordnern?
 
perfekt luckie, danke :???:

EWeiss 9. Jan 2009 08:43

Re: FindFirstFile: Wie suche ich auch in Unterordnern?
 
Zitat:

Zitat von Luckie
Und jetzt das ganze noch ohne TStrings und somit ohne die Unit Classes.pas:
Delphi-Quellcode:
type
  TStringDynArray = array of string;

var
  FileCount: Cardinal = 0;
  Files  : TStringDynArray = nil;

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);
      end;
    until FindNextFile(hFile, wfd) = False;
  finally
    Windows.FindClose(hFile);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i           : Integer;
begin
  Files := nil;
  FindAllFiles('d:\Dokumente', '*.*', True);
  for i := 0 to length(Files) - 1 do
  begin
    Listbox1.Items.Add(Files[i]);
  end;
end;

Kann es sein das hier was fehlt ?
Oder welchen sinn macht es das Extension (Mask) zu übergeben ?
Ich will schon alle Dateien addieren aber nur die welche dem Extension entsprechen..

Denke dann wäre es so richtig Oder ?
Delphi-Quellcode:
  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
        if ExtractFileExt(String(wfd.cFileName)) = Mask then
        begin
          FileCount := length(Files)+1;
          Setlength(Files, FileCount);
          Files[FileCount - 1] := RootFolder + String(wfd.cFileName);
        end;
      end;
    until FindNextFile(hFile, wfd) = False;
  finally
    Windows.FindClose(hFile);
  end;
gruss Emil

SirThornberry 9. Jan 2009 08:47

Re: FindFirstFile: Wie suche ich auch in Unterordnern?
 
Das ist so damit der Fragesteller auch noch etwas machen muss und nicht einfach nur copy & paste machen kann :)

EWeiss 9. Jan 2009 08:48

Re: FindFirstFile: Wie suche ich auch in Unterordnern?
 
Zitat:

Zitat von SirThornberry
Das ist so damit der Fragesteller auch noch etwas machen muss und nicht einfach nur copy & paste machen kann :)

Hab nix copie & Paste
Siehe Berichtigung meinerseits.

Denke auch wenn man schon code bereitstellt dann sollte er auch funktionieren ;)
kann es sein das einige Leute hier immer unfreundlicher werden ?

gruss Emil

Luckie 9. Jan 2009 09:08

Re: FindFirstFile: Wie suche ich auch in Unterordnern?
 
Mein Code funktioniert immer - nur eben manchmal nicht so, wie er soll. :mrgreen:

EWeiss 9. Jan 2009 09:26

Re: FindFirstFile: Wie suche ich auch in Unterordnern?
 
Zitat:

Zitat von Luckie
Mein Code funktioniert immer - nur eben manchmal nicht so, wie er soll. :mrgreen:

Nö ;)
Was macht es für einen sinn ein Extension innerhalb der Funktion zu übergeben wenn es nicht ausgewertet wird.
Ansonsten ja er funktioniert. :)

War auch nicht bös von mir gemeint .. hab mich halt nur gewundert.

gruss Emil


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

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