![]() |
Verzeichnisliste mit definierter Rekursionstiefe erstellen
Hi,
da ich mir vor kurzem die Finger gebrochen habe, um unter Vista eine Verzeichnisliste (nur Ordner) auszugeben, habe ich hier eine kleine Konsolen-Anwendung geschrieben. Syntax: Verzeichnisliste <Startverzeichnis> <Outputdatei> <maximale Baumtiefe> Das Programm legt nach Durchlauf die Outputdatei an (reine Textdatei). Diese enthält dann die Ordner, die je nach Tiefe entsprechend eingerückt sind. Hier der Code (recht übersichtlich):
Delphi-Quellcode:
Falls noch jemand Verbesserungspotential entdeckt, nur zu. Ich freue mich auf jede Anregung.
program Verzeichnisliste;
{$APPTYPE CONSOLE} uses SysUtils,strutils,classes; const //Um das Programm zu tracen,debuggen sollte Test = true gesetzt werden //Dadurch sind keine Kommandozeilenparameter notwendig, sondern es werden //Standardwerte gesetzt. Test = false; var ProtDatei : TStringList; ProtDateiName : string; MaxRek,Rekursionstiefe,x : integer; Einrueckstring : string = ' '; Verzeichnis : ansistring; Procedure IsFileInDirectory(ADirectory: string; max: integer); var SR: TSearchRec; begin if (ADirectory<>'') and (ADirectory[length(ADirectory)]<>'\') then ADirectory:=ADirectory+'\'; if (FindFirst(ADirectory+'*.*',faDirectory,SR)=0) and (rekursionstiefe < max)then begin repeat if (SR.Name<>'.') and (SR.Name<>'..') and (sr.Attr and faDirectory = faDirectory) then begin if rekursionstiefe = 0 then ProtDatei.Add(''); ProtDatei.add(leftstr(einrueckstring,Rekursionstiefe*2)+sr.name); inc(Rekursionstiefe); IsFileInDirectory(ADirectory+SR.Name,max); end; until FindNext(SR)<>0; FindClose(SR); end; dec(Rekursionstiefe); end; begin writeln('Verzeichnisliste (c) 2009 Andreas Welzien'); writeln; writeln('Erzeugt eine Liste aller Verzeichniss ab dem angegebenen Pfad (z.B. c:\).'); writeln('Die Ausgabe erfolgt in der definierten Outputdatei (z.B. Liste.txt).'); writeln('Über maximale Ordnertiefe (optional) kann die maximale Hierarchietiefe vorgegeben werden.'); writeln('Wird dieser Parameter nicht vorgegeben, wird immer bis zur maximalen Tiefe reportet.'); writeln; writeln('Aufruf: Verzeichnisliste.exe <Pfad> <Outputdatei> {<maximale Ordnertiefe>}'); if test then begin Verzeichnis := 'c:\'; ProtDateiName := 'test.txt'; maxrek := 2; end else begin Verzeichnis := paramstr(1); ProtDateiName := paramstr(2); maxrek := strtoint(paramstr(3)); end; ProtDatei := TStringList.Create; Rekursionstiefe := 0; IsFileinDirectory(Verzeichnis,maxrek); protdatei.SaveToFile(ProtDateiName); protdatei.Free; end. Gruß, Andreas |
Re: Verzeichnisliste mit definierter Rekursionstiefe erstell
Ich weis ja nicht ob du das wusstest, aber mit dir /A:D /B /S oder tree bekommt man auch alle Verzeichnisse angezeigt.
(Nur als Ergänzung - die Formatierung kann man da natürlich nur sehr begrenzt anpassen) |
Re: Verzeichnisliste mit definierter Rekursionstiefe erstell
Zitat:
Aber kann man dabei die Baumtiefe vorgeben (z.B. nur bis zum 2 Subverzeichnis)? |
Re: Verzeichnisliste mit definierter Rekursionstiefe erstell
Also ich würde die Ausgabe auf das StdOut ausgeben, also WriteLn ohne Dateivariable und ganz ohne Stringliste.
Die Ausgabe in ein Datei wird von Commandozeilen-Programmen i.d.R. durch eine Umleitung > FileName gesteuert. |
Re: Verzeichnisliste mit definierter Rekursionstiefe erstell
der Hinweistext writeln('Erzeugt eine... sollte standardmäßig eigentlich nur angezeigt werden, wenn man auch einen Hilfe-Parameter (ala -? -h /? /h ) angibt
oder bei Programmen, welche auf gewisse Parameter angewiesen sind, dann wenn diese nicht angegeben wurden. etwas unpraktisch, daß man immer alle Parameter angeben muß und die globalen Variablen ... ohne wäre es auch ohne viel Mehraufwand gegangen und die Deutsch-Englischmischung von Namen muß eigentlich auch nicht unbedingt sein :angel2: [add] nur schnell zusammengetippt und nicht getestet
Delphi-Quellcode:
program Verzeichnisliste;
{$APPTYPE CONSOLE} uses SysUtils, Classes; procedure ProgressDirectory(const ADirectory: string; MaxRek: integer; const Einrueckstring: String; ProtDatei : TStringList); var SR: TSearchRec; begin if (FindFirst(ADirectory + '*.*', faDirectory, SR) = 0) and (MaxRek > 0) then begin repeat if (SR.Name <> '.') and (SR.Name <> '..') and (SR.Attr and faDirectory <> 0) then begin if Assigned(ProtDatei) then ProtDatei.Add(Einrueckstring + SR.Name); ProgressDirectory(ADirectory + SR.Name + '\', MaxRek - 1, Einrueckstring + ' ', ProtDatei); end; until FindNext(SR)<>0; FindClose(SR); end; end; var Verzeichnis, ProtDateiName : string; ProtDatei : TStringList; MaxRek, i : integer; begin WriteLn('Verzeichnisliste (c) 2009 Andreas Welzien'); WriteLn; Verzeichnis := ''; ProtDateiName := ''; MaxRek := 8; for i := 1 to ParamCount do if AnsiMatchText(ParamStr(i), ['-?', '/?', '-h', '/h', '-help']) then begin WriteLn('Erzeugt eine Liste aller Verzeichniss ab dem angegebenen Pfad (z.B. c:\).'); WriteLn('Die Ausgabe erfolgt in der definierten Outputdatei (z.B. Liste.txt).'); WriteLn('Über maximale Ordnertiefe (optional) kann die maximale Hierarchietiefe vorgegeben werden.'); WriteLn('Wird dieser Parameter nicht vorgegeben, wird immer bis zur maximalen Tiefe reportet.'); WriteLn; WriteLn('Aufruf:'); WriteLn('Verzeichnisliste.exe -p:<Pfad> -o:<Outputdatei> -r:{<maximale Ordnertiefe>}'); Exit; end else if (Length(ParamStr(i)) > 3) and ((ParamStr(i)[1] = '-') or (ParamStr(i)[1] = '/')) then if ParamStr(i)[2] in ['p', 'P'] then Verzeichnis := Copy(ParamStr(i), 3, Length(ParamStr(i))) else if ParamStr(i)[2] in ['o', 'O'] then ProtDateiName := Copy(ParamStr(i), 3, Length(ParamStr(i))) else if ParamStr(i)[2] in ['r', 'R'] then MaxRek := StrToInt(Copy(ParamStr(i), 3, Length(ParamStr(i)))); if (Verzeichnis <> '') and (Verzeichnis[Length(Verzeichnis)] <> '\') then Verzeichnis := Verzeichnis + '\'; if ProtDateiName <> '' then ProtDatei := TStringList.Create else ProtDatei := nil; ProgressDirectory(Verzeichnis, MaxRek, '', ProtDatei); if ProtDateiName <> '' then begin ProtDatei.SaveToFile(ProtDateiName); ProtDatei.Free; end; end. |
Re: Verzeichnisliste mit definierter Rekursionstiefe erstell
Zitat:
voll fies!!! Wollte ich doch eigentlich selbst machen!!! Macht ja gar keinen Spass hier :( Nein im Ernst, großes Lob an den fleißigen Tipper :-D Ich schau mir den Code mal genauer an. Besten Dank, Andreas |
Re: Verzeichnisliste mit definierter Rekursionstiefe erstell
Ich hoff auch der Code läuft so :oops:
Ansonsten läßt es sich ja noch verbessern:
Nja, ich hoff etwas geholfen zu haben ... es macht sich immer etwas besser, wenn sich Programme ähnlich bediehnen lassen, wie Andere. :angel: Find es aber schade, daß seitens Delphi die Parameterabfrage etwas umständlich ist und man selber parsen/suchen muß. :| |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:57 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