Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi DateiAttribute aus ListBox auslesen (https://www.delphipraxis.net/8937-dateiattribute-aus-listbox-auslesen.html)

Gregor00 15. Sep 2003 15:54


DateiAttribute aus ListBox auslesen
 
Hallo,

also ich sitzt hier vor folgendem Problem: Ich hab ein Dateiensuchprogramm geschrieben dessen Ergebnisse in eine Listbox geladen werden. jetzt möchte ich die Attribute auslesen, was an sich auch kein Problem ist, wenn man einen festen Pfad angeben kann. da ich jedoch keine festen Pfade angeben kann funktioniert das nicht.
Hier als kleiner Hinweis was ich meine der Quellcode der Suchfunktion;
Wenn gewünscht kann ich den Source dür die Suchfunktion angeben, glaube aber das ist für das problem nicht nötig :shock:

Also thx für alle antworten schon mal....
greg

Tpercon 15. Sep 2003 16:09

Re: DateiAttribute aus ListBox auslesen
 
Was steht den in der ListBox drin?

Gregor00 15. Sep 2003 16:16

Re: DateiAttribute aus ListBox auslesen
 
in der Listbox stehen die Dateinamen mit Endung (z.b. blablabla.txt) (untereinander). Auf Wunsch kann der Pfad (z.B c:\Eigene Dateien\blablabla.txt) mit angegeben werden...

greg

Tpercon 15. Sep 2003 16:19

Re: DateiAttribute aus ListBox auslesen
 
Dann speicher dir den Pfad doch in irgend einer Variablen! Somit hast du dann wieder der kompletten Dateinamen.

Gregor00 17. Sep 2003 17:39

Re: DateiAttribute aus ListBox auslesen
 
also irgentwie klappt das doch noch nicht so ganz... muss nochmal einen schritt zurück gehen: das programm soll alle Unterordner eines vorher vorgegebenen Pfades einer bestimmten Endung anzeigen
Der volgende Quelltext zeigt wie ich es versucht habe, es klappt jedoch nicht (:

Delphi-Quellcode:
procedure TForm1.Suche (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
  begin
    If (sr.Attr <> 0) and (faDirectory <> 0) then
      begin
    Suche(ext, Edit2.Text + '\' + sr.Name);
    ListBox2.Items.Add(pfad + '\' + sr.Name);
    end
    else
   //  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;
Edit1 gibt die Dateiendung an (z.B. TXT)
Edit2 den Pfad
ListBox1 soll alle gefundenen Dateien aufführen,
ListBox2 alle durchsuchten/gefundenen ordner



ein Klick auf Button1 startet den Suchvorgang:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin

Button1.Enabled:= False;
ListBox1.Clear;
ListBox2.Clear;
Suche(Edit1.Text, Edit2.text);
Button1.Enabled:= True;

end;
ich hoffe ihr könnt mir helfen, jab schon alles mögliche versucht :oops:

thx
gregor

Christian Seehase 17. Sep 2003 17:51

Re: DateiAttribute aus ListBox auslesen
 
Moin Gregor,

ich hab' Deine Methode Suche mal überarbeitet und kommentiert


Delphi-Quellcode:
procedure TForm1.Suche (ext: string; pfad: String);
var sr: TSearchRec;
    r: Integer;

begin
  r:= FindFirst( pfad + '\*.*', faAnyFile,sr);
  if r = 0 then begin // nur wenn FindFirst erfolgreich war, gibt's auch was zu schliessen
    try // Resourcenschutzblock eingebaut
      while r = 0 do
      begin
        // falsch, da ein Datei-/Verzeichnisname auch mit . beginnen kann
        // es muss explizit auf . und .. geprüft werden
//        If Copy(sr.Name, 1, 1) <> '.' then
      if (sr.Name <> '.') and (sr.Name <> '..') then
      begin
        // gefundenes Attribut ausmaskieren und mit gewünschtem vergleichen
        if (sr.Attr and faDirectory) = faDirectory then
//        If (sr.Attr <> 0) and (faDirectory <> 0) then
          begin
        Suche(ext, Edit2.Text + '\' + sr.Name);
        ListBox2.Items.Add(pfad + '\' + sr.Name);
        end
        else
        if AnsiUpperCase(ExtractFileExt(sr.Name)) = '.'+AnsiUpperCase(ext) then
       //  If System.Copy (sr.Name, Pos('.' , sr.Name), 4) = '.' + ext then
        ListBox1.Items.Add(pfad + '\' + sr.Name);
      end;
      Application.ProcessMessages;
      r:= FindNext(sr);
      end;
    finally
      FindClose(sr);
    end;
  end;
end;
das mit dem str3 hab' ich nicht verstanden.
Extensions können beliebig lang sein.

Gregor00 17. Sep 2003 21:40

Re: DateiAttribute aus ListBox auslesen
 
ok danke für die antwort hab's ausprobiert funtioniert bis jetzt ganz gut :lol:

mit dem Str3 hab ich halt gemacht, weil die Dateiendungen nicht mehr als 3 Ziffern haben dürfen (bzw. vom benutzer angegeben werden dürfen).

Wenn ich jetzt dur den Sngegebenen Ordner durchsuchen lassen will (also ohne Unterordner) kann ich da die gleiche Procedur nehmen?? oder ist es sinnfoller noch eine zweite zu deklarieren??
Stell mir das ganze so vor das der User mit Hilfe einer Checkbox zwischen "Mit Unterordner" oder "ohne Unterordner" wählen kann.

cu gregor

Christian Seehase 17. Sep 2003 21:44

Re: DateiAttribute aus ListBox auslesen
 
Moin Gregor,

dann bau in die Parameterliste noch ein Flag ein, dass die Unterscheidung ermöglicht.
In der Routine musst Du dann nur noch das Flag abfragen, und ggf. bei auftreten eines Verzeichnisses dieses nicht weiter beachten.

Gregor00 18. Sep 2003 14:56

Re: DateiAttribute aus ListBox auslesen
 
danke für den Tipp aber nen Flag will ich nicht verwenden....eine einfache Checkbox find ich einfacher...
ich hab jetzt eine zweite procedure deklariert (fast die gleiche, die
Christian Seehase mir modifiziert hat) funtioniert aber nicht PC hängt sich immer auf (muss irgentwo eine Entlosschleife sein...) könnt ihr mir nochmal helfen was genau ich ändern muss

vielen Dank
greg

Tpercon 18. Sep 2003 15:08

Re: DateiAttribute aus ListBox auslesen
 
Ganz einfach. Wenn die CheckBox markiert / das Flag entsprechend gesetzt ist, darf man nicht nach Ordnern suchen (<> faDirectory).

Ne einfache If Abfrage sollte wohl jeder hinbekommen.

Gregor00 18. Sep 2003 15:28

Re: DateiAttribute aus ListBox auslesen
 
die If - abfrage ist auch nicht das problem.
Das problem ist, ich weiß nicht was ich an der procedure ändern muss damit KEINE Unterordner durchsucht werden. Alle Versuche haben bis jetzt zu einer Endlosschleife geführt...

Tpercon 18. Sep 2003 15:33

Re: DateiAttribute aus ListBox auslesen
 
Der Teil der für die Rekursion da ist, ist ja folgender
Delphi-Quellcode:
Suche(ext, Edit2.Text + '\' + sr.Name);
Warum steht da eigentlich Edit2.Text :gruebel: , da muß auch pfad hin! Das hätte so doch garnicht funktionieren können?! Poste mal deinen bisherigen Code!

Gregor00 18. Sep 2003 15:59

Re: DateiAttribute aus ListBox auslesen
 
ja hast recht "pfad" muss dahin, vorher ging es auch es wurden aber nicht alle ordner komplett durchsucht, deshalb ist es mir nicht gleich aufgefallen:

Hier nochmal die procedure inklusieve Unterordnern durchsuchen:

Delphi-Quellcode:
procedure TFormDateienSuchen.UnterordnerDurchsuchen(ext: Str3; Pfad : String);
  var sr: TSearchRec;
       r: Integer;
begin
  r:= FindFirst(Pfad + '\*.*' , faAnyFile,sr);
  if r = 0 then begin
  try
  while r = 0 do
  Begin
      if (sr.Name <> '.') and (sr.Name <> '..') then
        begin
        If (sr.Attr and FaDirectory) = faDirectory then
          begin
            UnterordnerDurchsuchen (ext,pfad + '\' + sr.Name);
            ListBoxOrdner.Items.Add(Pfad + '\' + sr.Name);
          end
       else
       if AnsiUpperCase(ExtractFileExt(sr.Name)) = '.'+ AnsiUpperCase(ext) then
          ListBoxDateien.Items.Add(pfad + '\' + sr.Name);
       end;
     //  Application.ProcessMessages;
       r:= FindNext (sr);
     end;
     finally
     FindClose (sr);
     end;
   end;

end;
Hier die procedure ohne Unterordner durchsuchen:

Delphi-Quellcode:
procedure TFormDateienSuchen.Durchsuchen(ext: Str3; Pfad : String);
  var sr: TSearchRec;
       r: Integer;
begin
  r:= FindFirst(Pfad + '\*.*' , faAnyFile,sr);
  if r = 0 then
  begin
    try
    while r = 0 do
    Begin
      if (sr.Name <> '.') and (sr.Name <> '..') then
        Begin
          ListBoxDateien.Items.Add(pfad + '\' + sr.Name);
        end;
      end;
       Application.ProcessMessages;
       r:= FindNext (sr);
 //  end;
       finally
       FindClose (sr);
  end;
 end;
end;
so funtioniert es aber nicht. es wird zwar compiliert, hängt aber dann bei aktivierung der procedure in einer endlosschleife...

greg

Gregor00 18. Sep 2003 17:55

Re: DateiAttribute aus ListBox auslesen
 
hey ich komm so nicht weiter...das problem ist warscheinlich gant einfach ich find die lösung aber trotzdem nicht...also helft mich noch ein letztes mal :oops:

danke
gregor

Tpercon 19. Sep 2003 07:52

Re: DateiAttribute aus ListBox auslesen
 
Erstens hat Sakura :gruebel: in der Code Library schon mal nen passenden Code gepostet und zweitens ist ja wohl diese Zeile
Delphi-Quellcode:
UnterordnerDurchsuchen (ext,pfad + '\' + sr.Name);
fürs rekursive durchsuchen verantwortlich.

Also änder die in die folgenden Zeilen:
Delphi-Quellcode:
if CheckBox1.Checked then begin
  UnterordnerDurchsuchen (ext,pfad + '\' + sr.Name);
end;
Das müßte theoretisch funktionieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:50 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