Delphi-PRAXiS

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 Ordnernamen auslesen (https://www.delphipraxis.net/120553-ordnernamen-auslesen.html)

BullsEye 12. Sep 2008 16:20


Ordnernamen auslesen
 
Hallo Leute,

Also, ich habe ein Programm, da kann ich auf Buttonklick Einträge in eine ListeBox (Liste) hinzufügen.

Delphi-Quellcode:
IF (Edit1.Text <> '') THEN
Liste.AddItem(Edit1.Text + ' (' + ComboBox1.Text + ' | '+ Label1.Caption + ' | '+ Label2.Caption + ')',Sender);
ELSE
ShowMessage('Bitte geben Sie einen Namen an!');
Und um mir die Arbeit zu erleichtern, ist mir gerade folgendes Eingefallen:

Ich will einen Pfad (C:\Medien\TestOrdner) durchsuchen. In dem Ordner sind weitere Unterordner.
Die Namen der Ordner innerhalb des Pfades soll zur Listbox (Liste) hinzugefügt werden!


ODER:

Wäre es besser, den Pfad nach bestimmten Dateitypen (*.avi|*.divX etc) zu durchsuchen und deren Namen dann zur ListBox hinzuzufügen?
Das hätte dann den Vorteil, das ich die Datei auch gleich von meinem Programm aus starten könnte.


1) Welche Lösung ist besser?
2) Bzw gibts noch ne andere Lösung die ggf noch besser ist?
3) Wie realisier ich das?

Und das ganze sollte möglichst einfach & schnell (also das Laden) sein!


Danke & gruß

LuCSteR 12. Sep 2008 16:26

Re: Ordnernamen auslesen
 
der code funktioniert.

Delphi-Quellcode:
//Listet alle Namen von Ordnern in einem Verzeichnis
procedure ListSubDirs(sDir: string; const sList: TStrings);
var Rec: TSearchRec;
begin
  sList.BeginUpdate;
  try
    sList.Clear;
    if FindFirst(IncludeTrailingPathDelimiter(sDir) + '*.*', faDirectory or faReadOnly or faHidden or faArchive, Rec) = 0 then
    begin
      repeat
        if (((Rec.Attr and faDirectory) = faDirectory) and (Rec.Name <> '.') and (Rec.Name <> '..')) then sList.Add(Rec.Name);
      until FindNext(Rec) <> 0;
      SysUtils.FindClose(Rec);
    end;
  finally
    sList.EndUpdate;
  end;
end;
je nach dem was du nun machen willst, ist dieser code umzuschreiben oder nicht. so wie es in der ersten zeile steht, werden alle ordnernamen eines verzeichnisses in der sList:TStrings gelistet.

DeddyH 12. Sep 2008 17:25

Re: Ordnernamen auslesen
 
Hab ich schonmal gesehen :mrgreen:

BullsEye 24. Apr 2009 20:54

Re: Ordnernamen auslesen
 
So, ich hab jetzt folgenden Code um Ordnernamen auszulesen.

Delphi-Quellcode:
procedure ListSubDirs(sDir: string; const sList: TStrings);
var Rec: TSearchRec;
begin
  sList.BeginUpdate;
  try
  //  sList.Clear;
    if FindFirst(IncludeTrailingPathDelimiter(sDir) + '*.*', faDirectory or faReadOnly or faHidden or faArchive, Rec) = 0 then
    begin
      repeat
        if (((Rec.Attr and faDirectory) = faDirectory) and (Rec.Name <> '.') and (Rec.Name <> '..')) then sList.Add(Rec.Name);
      until FindNext(Rec) <> 0;
      SysUtils.FindClose(Rec);
    end;
  finally
    sList.EndUpdate;
  end;
end;
Allerdings werden keine Unterordner mit ausgelesen (Das bissel umständlich). Was ich jetzt aber möchte, ist das nur die Ordnernamen ausgelesen werden, in der eine Datei von einem bestimmten Dateityp ist. (BSP: .txt , .doc, .rtf etc)

EDIT: Die procedure ist in einer DLL und wird zur Laufzeit

jaenicke 25. Apr 2009 00:03

Re: Ordnernamen auslesen
 
Dann musst du eben in jedem Ordner noch nach den enthaltenen Dateien schauen. Ein Beispiel grundsätzlich dafür siehst du z.B. hier:
http://www.delphipraxis.net/internal...=392510#392510

DeddyH 25. Apr 2009 09:31

Re: Ordnernamen auslesen
 
Meinst Du so etwas?
Delphi-Quellcode:
procedure ListSubDirsContainingFiles(StartPath: string;
                                     const Extension: string;
                                     const sList: TStrings);
var Rec: TSearchRec;
    FileFound: Boolean;
begin
  //Bei ungültigem Verzeichnis Exception auslösen
  if not DirectoryExists(StartPath) then
    raise Exception.CreateFmt('Verzeichnis "%s" existiert nicht.',
                              [ExcludeTrailingPathDelimiter(StartPath)]);
  //Sicherstellen, dass Verzeichnisname mit Backslash endet
  StartPath := IncludeTrailingPathDelimiter(StartPath);
  //lokale Variable initialisieren
  FileFound := false;
  //im aktuellen Verzeichnis nach Dateien mit der angegebenen Endung suchen
  if FindFirst(StartPath + Extension,faAnyFile,Rec) = 0 then
    try
      repeat
        //nur Dateien, keine Verzeichnisse
        FileFound := (Rec.Attr and faDirectory) = 0;
      until FileFound or (FindNext(Rec) <> 0);
    finally
      SysUtils.FindClose(Rec);
    end;
  //bei Treffer Verzeichnis zur Liste hinzufügen
  if FileFound then
    sList.Add(ExcludeTrailingPathDelimiter(StartPath));
  //nun nach Unterverzeichnissen suchen und rekursiv durchgehen
  if FindFirst(StartPath + '*',faDirectory,Rec) = 0 then
    try
      repeat
        if ((Rec.Attr and faDirectory) = faDirectory) and
           (Rec.Name <> '.') and (Rec.Name <> '..') then
          ListSubDirsContainingFiles(StartPath + Rec.Name,Extension,sList);
      until FindNext(Rec) <> 0;
    finally
      SysUtils.FindClose(Rec);
    end;
end;
Ich hoffe, ich habe verständlich kommentiert. Evtl. kann das noch optimiert werden, aber es funktionierte zumindest in kurzen Tests :zwinker:

BullsEye 26. Apr 2009 10:21

Re: Ordnernamen auslesen
 
Sry, hatte gar nicht gesehen, das jdn geantwortet hat. War nicht als neues Beitrag makiert. :drunken:

Danke, DeddyH genau sowas meinte ich! DANKE!


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