Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Dateien Suchen nach Endung? (https://www.delphipraxis.net/86133-dateien-suchen-nach-endung.html)

Flom 9. Feb 2007 17:53


Dateien Suchen nach Endung?
 
Hallo,
Ich möchte nach bestimmten Dateien Suchen für ein Programm aber das stürzt immer wieder ab nur wieso ?
Ich habe folgende Prozeduren...

Zur Suche:
Delphi-Quellcode:
procedure TForm1.SucheDir(ext:Str3; pfad:String);
var sr:TSearchRec;
    r:integer;
begin
  r:=FindFirst(pfad+'\*.*',faAnyFile,sr);
  while r=0 do
  begin
    if Copy(sr.name,1,1)<>'.' then (*. und .. in Verzeichznissen ignorieren *)
    begin
      if (sr.attr<>0) and (faDirectory<>0) then (* Verzeichnis gefunden *)
        SucheDir(ext,pfad+'\'+sr.name)
      else (* Datei: ist die Erweiterung ok? dann anzeigen *)
        if System.Copy(sr.name, Pos('.',sr.name),4)='.'+ext then
          ListBox1.Items.Add(pfad+'\'+sr.name);
    end;
    Application.ProcessMessages;
    r:=FindNext(sr);
  end;
  FindClose(sr);
end;
Button 1:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if Length(Edit1.Text) > 3 then
  begin
    ShowMessage('Bitte maximal 3 Zeichen für die Erweiterung eingeben!');
    exit;
  end;
  Button1.Enabled:=false;
  ListBox1.Clear;
  SucheDir(Edit1.Text,DriveComboBox1.Drive+':');
  Button1.Enabled:=true;
end;

SirThornberry 9. Feb 2007 17:59

Re: Dateien Suchen nach Endung?
 
dazu sollte es jede menge Beispiele geben. Als tipp:
Delphi-Quellcode:
if Copy(sr.name,1,1)<>'.' then
Diese Anweisung filtert nicht nur "." und ".." sondern alles was mit einem "." beginnt.

und Anstelle von
Delphi-Quellcode:
System.Copy(sr.name, Pos('.',sr.name),4)
kannst du auch
Delphi-Quellcode:
ExtractFileExt(sr.name)
verwenden. Dann solltest du beachten das zum Beispiel ".txt" und ".TxT" nicht das gleiche ist.
Dein vergleich
Delphi-Quellcode:
if System.Copy(sr.name, Pos('.',sr.name),4)='.'+ext then
schlägt also auch fehl wenn groß/klein-schreibung verschieden ist.

Zudem wäre es recht hilfreich wenn du uns den Fehler nennen würdest der ab und zu kommt und an welcher Stelle dieser kommt.

Flom 9. Feb 2007 18:04

Re: Dateien Suchen nach Endung?
 
Sobald er sucht...
Er sucht 3 Sekunden und folgender Fehler kommt: Runtime error 202 at 0001:01BE.

SirThornberry 9. Feb 2007 18:09

Re: Dateien Suchen nach Endung?
 
mir fällt grad auf das dies hier auch unsinnig ist:
Delphi-Quellcode:
if (sr.attr<>0) and (faDirectory<>0) then
faDirectory ist eine Konstante die immer ungleich 0 ist (somit ist der Teil hinfällig) und sr.attr ist ungleich 0 wenn die Datei versteckt, schreibgeschützt, Archiv, ein Verzeichnis oder ein Volume ist. Das ganze ist also recht unzuverlässig. Dementsprechend würdest du also wenn eine Datei Namens "hallo.txt" gefunden wird welche schreibgeschützt ist diese als Verzeichnis ansehen und dann nach "pfad\hallo.txt\*.*" suchen.
Wie bereits erwähnt gibt es genug funktionierende Beispiel über die Suchfunktion zu finden.

shmia 9. Feb 2007 18:10

Re: Dateien Suchen nach Endung?
 
Hier zunächst mal eine ganz saubere Prozedure um Dateien aufzulisten:
Delphi-Quellcode:
function BuildFileList(const Path: string; const Attr: Integer; const List: TStrings): Boolean;
var
  SearchRec: TSearchRec;
  R: Integer;
begin
  Assert(List <> nil);
  R := FindFirst(Path, Attr, SearchRec);
  Result := R = 0;
  List.BeginUpdate;
  try
    if Result then
    begin
      while R = 0 do
      begin
        if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
          List.Add(SearchRec.Name);
        R := FindNext(SearchRec);
      end;
      Result := R = ERROR_NO_MORE_FILES;
    end;
  finally
    SysUtils.FindClose(SearchRec);
    List.EndUpdate;
  end;
end;
Nimm diese Procedure und alles wird gut!
Delphi-Quellcode:
var
   pfad:string;
begin
  pfad := DriveComboBox1.Drive+':\*.*';
  pfad := changeFileExt(pfad, Edit1.Text);
  BuildFileList(pfad,faAnyFile, ListBox1.Items);
Siehst du auch den Unterschied zwischen SucheDir() und BuildFileList() ????
BuildFileList() ist universell einsetzbar; du kannst die Funktion nehmen und einfach
in ein anderes Delphi-Projekt übernehmen.

Flom 9. Feb 2007 18:13

Re: Dateien Suchen nach Endung?
 
Zitat:

Zitat von SirThornberry
Wie bereits erwähnt gibt es genug funktionierende Beispiel über die Suchfunktion zu finden.

Gibt es nicht Suche erfolglos beim suchen nach: Datei Suchen, Suche Datei

@shmia danke :) werds mal ausprobieren :) bei fragen meld ich mich

SirThornberry 9. Feb 2007 18:16

Re: Dateien Suchen nach Endung?
 
Zitat:

Zitat von Flom
Zitat:

Zitat von SirThornberry
Wie bereits erwähnt gibt es genug funktionierende Beispiel über die Suchfunktion zu finden.

Gibt es nicht Suche erfolglos beim suchen nach: Datei Suchen, Suche Datei

@shmia danke :) werds mal ausprobieren :) bei fragen meld ich mich

ok, dann hast du nach dem falschen gesucht. Wenn man weiß das man mit FindFirst/FindNext dateien sucht kann man eben genau nach diesen Befehlen auch suchen.

Christian Seehase 9. Feb 2007 18:23

Re: Dateien Suchen nach Endung?
 
Moin Zusammen,

Zitat:

Zitat von SirThornberry
dazu sollte es jede menge Beispiele geben. Als tipp:
Delphi-Quellcode:
if Copy(sr.name,1,1)<>'.' then
Diese Anweisung filtert nicht nur "." und ".." sondern alles was mit einem "." beginnt.

wobei man noch dazu anmerken sollte, dass Datei- und Verzeichnisnamen durchaus mit einem . beginnen dürfen.
Man kann es nur noch so im Explorer eingeben.

Mazel 9. Feb 2007 18:39

Re: Dateien Suchen nach Endung?
 
Hi,

ich habe mal schnell einen Code entwickelt der dir helfen sollte. Es sind zwar schon einige Beispiele genannt worden aber ich will dir meinen nicht vorenthalten:
Delphi-Quellcode:
procedure TForm1.CreateFileList(Dir, Ext: String; UseSubDirs: Boolean);
var
 SR: TSearchRec;

begin
 If FindFirst(Dir + '*.*', faAnyFile, SR) = 0 then
 Repeat
  If (SR.Attr and faDirectory = faDirectory) and (SR.Name <> '.') and (SR.Name <> '..') and (UseSubDirs) then CreateFileList(IncludeTrailingPathDelimiter(Dir + SR.Name), Ext, UseSubDirs)
  Else If LowerCase(ExtractFileExt(SR.Name)) = LowerCase(Ext) then
   begin
    Application.ProcessMessages;
    ListBox1.Items.Add(Dir + SR.Name);
   end;
 Until FindNext(SR) <> 0;
 FindClose(SR);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 ListBox1.Clear;
 CreateFileList(DriveComboBox1.Drive + ':\', Edit1.Text, CheckBox1.Checked);
end;
Wie gesagt, auf die schnelle, sollte aber fuktionieren.

Gruß
Mazel

ErazerZ 9. Feb 2007 19:06

Re: Dateien Suchen nach Endung?
 
Eins verstehe ich nicht, warum nicht gleich z.b. FindFirst('c:\*.endung', ..) ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:44 Uhr.
Seite 1 von 2  1 2      

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