Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   rekursionstiefe erkennen bei ordnern (https://www.delphipraxis.net/181944-rekursionstiefe-erkennen-bei-ordnern.html)

blinder007 19. Sep 2014 13:42

rekursionstiefe erkennen bei ordnern
 
hallo liebe foren-mitglieder,
also, ich schreibe zzt. ein Programm um meine Musiksammlung nicht per hand in eine datenbank eingliedern zu müssen. die ordner sind in genre, künstler, album aufgeteilt. mit der findfirst methode und diesen dingen schaffe ich es eine liste aller Ordner zu erhalten und sie auszugeben. Sprich: ich habe (in dem fall) eine Textdatei oder halt eine tstringlist, in der untereinander weg erst genre, dan künstler und dann album stehen. für einen uneingeweiten ist das natürlich unübersichtlich. deswegen würde ich gerne vor die einträge schreiben etwas wie "künstler:" und "album". sozusagen unterüberschriften einfügen. die ausgabe soll im enteffekt auch dazu genutzt werden außenstehenden einen Überblick über meine Sammlung zu geben.
mein ansatz war zu erkennen, auf welcher rekursionstiefe die funktion ist, um ein entsprechendes präfix zu setzen. das funktioniert leider nicht so ganz. hier mein code der besagten methode:
Delphi-Quellcode:
procedure tform1.FindAllFiles(var FileList: TStrings; RootFolder: string; Mask: string ='*.*'; Recurse: Boolean = True);
procedure schreibename(name: string);
begin
if not (name[1] = '.') then liste.Add(name);
end;
var
SR: TSearchRec;
begin
RootFolder := IncludeTrailingPathDelimiter(RootFolder);
if Recurse then
        if FindFirst(RootFolder + '*.*', faAnyFile, SR) = 0 then
        try
        repeat
        if SR.Attr and faDirectory = faDirectory then begin
                if (sr.name <> '.') and (SR.Name <> '..') then
         FindAllFiles(FileList, RootFolder + SR.Name, Mask, Recurse);
         //schreibename(sr.name);
         end;
        until FindNext(SR) <> 0;
        finally
        FindClose(SR);
end;

 if FindFirst(RootFolder + Mask, faAnyFile, SR) = 0 then
  try
   repeat
     if SR.Attr and faDirectory <> faDirectory then
     begin
      //FileList.Add(RootFolder + SR.Name);
       end;
      until FindNext(SR) <> 0;
     finally
   FindClose(SR);
  end;
 end;

TiGü 19. Sep 2014 14:22

AW: rekursionstiefe erkennen bei ordnern
 
Zitat:

Zitat von blinder007 (Beitrag 1273175)
das funktioniert leider nicht so ganz.

Was genau funktioniert denn nicht?

himitsu 19. Sep 2014 14:37

AW: rekursionstiefe erkennen bei ordnern
 
Delphi-Quellcode:
...; Recurse: Boolean = True; Recursionstiefe: Integer=0);
und dann beim Aufruf der Recursion dort Recursionstiefe+1 übergeben? :stupid:


Zitat:

das funktioniert leider nicht so ganz. hier mein code der besagten methode:
Nicht ganz?

Es geht garnicht, denn entgegen deiner Beschreibung ist da doch garnichts an Code drin enthalten, was dafür zuständig sein könnte.
Dein nicht vorhandener Versuch funktioniert also ohne Probleme. (es ist nichts drin, was nicht funktioniert und somit funktioniert alles, wie es soll :roll:)



Zitat:

Delphi-Quellcode:
if not (name[1] = '.') then liste.Add(name);

Falsch, denn um dich einfach mal nach Linux, oder besser in einen Apache gucken zu lassen ... du kennst nicht zufällig Dateien wie .htaccess, oder wie wäre es mit den .git- und .svn-Verzeichnissen?
Auch wenn der Explorer sich weigert solche Dateinamen händisch anlegen zu lassen. Das Dateisystem erlaubt es und viele Programme machen es auch.

Delphi-Quellcode:
if (Name <> '.') and (Name <> '..') then
oder
Delphi-Quellcode:
if MatchStr(Name, ['.', '..']) then
wäre möglich.
Rein theoretisch wäre es möglich im Dateisystem eine Datei "ohne" Namen zu haben, womit dann ein Zugriff ala
Delphi-Quellcode:
Name[1]
knallen würde, da es kein erstes Zeichen gibt, aber zum Glück für dich ist das nahezu ausgeschlossen.

Oder wolltest du damit Verzeichnisse mit solchen Namen ausblenden?

blinder007 19. Sep 2014 15:05

AW: rekursionstiefe erkennen bei ordnern
 
ich habe versucht einen integer in die procedure einzubauen, der die recursionstiefe mitzählt. aber im enteffekt hatte ich immer nur den schleifendurchlauf, aber nie die rekursionstiefe

Faxe 19. Sep 2014 15:18

AW: rekursionstiefe erkennen bei ordnern
 
Zitat:

Zitat von blinder007 (Beitrag 1273175)
if SR.Attr and faDirectory <> faDirectory then

Was bringt eigentlich hierbei die 2. Bedingung?

pelzig 19. Sep 2014 15:19

AW: rekursionstiefe erkennen bei ordnern
 
Eine Procedure (tform1.FindAllFiles) rekursiv aufrufen?

himitsu, bitte übernehmen Sie :wink:

MfG

Mikkey 19. Sep 2014 15:41

AW: rekursionstiefe erkennen bei ordnern
 
Mal abgesehen vom Lerneffekt...

Mit dem Kommandozeilenbefehl
Code:
DIR {Verzeichnis} /S /B
erhältst Du eine wunderschöne Liste aller Dateien im angegebenen Verzeichnis und südlich davon.

Das ließe sich per Programm auch gut auseinandernehmen...

himitsu 19. Sep 2014 16:00

AW: rekursionstiefe erkennen bei ordnern
 
Zitat:

Zitat von Mikkey (Beitrag 1273203)
Mal abgesehen vom Lerneffekt...

Seit paar Jahren gibt es auch die Unit IOUtils, worin sich z.B. ein TDirectory.GetFiles versteckt.


Zitat:

ich habe versucht einen integer in die procedure einzubauen, der die recursionstiefe mitzählt. aber im enteffekt hatte ich immer nur den schleifendurchlauf, aber nie die rekursionstiefe
Eine lokale Variable in der Funktion kann natürlich nur Dinge darin zählen, aber nichts Prozedurübergreifendes.
Dafür braucht man entweder eine böse globale Variable, was wir natürlich nicht verwenden
oder man muß die Variable an die anderen Prozeduren übergeben. (als VAR kann man die Verzeichnisanzahl zählen und als normaler Parameter die Tiefe, da sich Änderungen immer nur nach unten auswirken und nicht zurück)

pelzig 19. Sep 2014 16:17

AW: rekursionstiefe erkennen bei ordnern
 
Müsste man beim rekursiven Procedure-Aufruf nicht irgendwo trotzdem noch global den Anfangswert der Rekursionstiefe setzen :?:

MfG

Faxe 19. Sep 2014 17:29

AW: rekursionstiefe erkennen bei ordnern
 
Man könnte auch bei jedem gefundenen Ordner im Namen mal die PathDelimiter zählen und das als jeweilige Tiefe ansehen.


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