![]() |
Re: suche Funktion FindLastDir
Hi,
Dafür gibts doch schon einen Funktion in der Codelib ich meine die nennt sich ![]() Die liest dir alle Dateien eines Ordners aus und schreibt sie in eine Stringlist und von da an sollte der Rest kein Problem mehr darstellen |
Re: suche Funktion FindLastDir
Zitat:
|
Re: suche Funktion FindLastDir
Warum nur FindFirst? Was ist wenn das Verzeichnis mehrere Unterverzeichnisse hat?
|
Re: suche Funktion FindLastDir
Zitat:
Wie wäre es mit dem ersten Finden des Unterordners verschachtelt diesen wieder als Path in die Funktion zu leiten um wiedrum den ersten Unterordner zu finden, wenn kein UnterOrdner mehr zu finden, dann Rückgabe des letzen Path ? Dann hätte ich schonmal den Pfad. Diesen kann ich dann mit FindAllFiles nach Dateien durchsuchen und abspielen... Ich versuche morgen mal einen Ansatz anzubieten.. Gruß, bluescreen25 |
Re: suche Funktion FindLastDir
Hi,
Ich hab da mal was gebastelt, das sollte wenn wir nicht völlig aneinander vorbeireden in etwa hinkommen. Eigentlich soll man ja keine Lösungen posten, aber trotzdem:
Delphi-Quellcode:
Edit: Absichtlich nicht kommentiert versuch selbst herauszufinden wie und warum, bei Fragen her damit
function FindLastDir(sDirectory : string) : string;
var SearchRec : TSearchRec; begin sDirectory := IncludeTrailingPathDelimiter(sDirectory); result := sDirectory; if FindFirst(sDirectory + '*.*', faDirectory, SearchRec) = 0 then begin try repeat if ((SearchRec.Attr and faDirectory) = faDirectory) and(SearchRec.Name <> '.') and (SearchRec.Name <> '..') then begin result := FindLastDir(sDirectory + SearchRec.Name); break; end; until FindNext(SearchRec) <> 0; finally FindClose(SearchRec); end; end; end; |
Re: suche Funktion FindLastDir
Wow, ansatzweise hatte ich das auch noch so hinbekommen, scheiterte an Einzelheiten...zumindest bin ich jetzt in der Lage, weitere Teilfunktionen zu erstellen, ich denke, ich habs verstanden...
Vielen Dank.. :-D Zitat:
|
Re: suche Funktion FindLastDir
Zitat:
Angenommen ich habe einen Verzeichnisbaum der so aussieht, Zitat:
Delphi-Quellcode:
FindLastDir('C:\Ebene1')
Code:
Daraus folgt der Rückgaberwert der Funktion ist immer der im letzten Aufruf ermittelt String.
Dann sieht Result so aus:
1. Aufruf: 1. Zuweisung: result = 'C:\Ebene1\' 2. Aufruf: 1. Zuweisung: result = 'C:\Ebene1\Ebene2\' 3. Aufruf: 1. Zuweisung: result = 'C:\Ebene1\Ebene2\Ebene3\' 2. Zuweisung: result = 'C:\Ebene1\Ebene2\Ebene3\Ebene4\' 4. Aufruf: 1. Zuweisung: result = 'C:\Ebene1\Ebene2\Ebene3\Ebene4\' // --> 2.Zuweisung wir nicht ausgeführt! kehrt zurück zum 3. Aufruf: 2. Zuweisung: result = 'C:\Ebene1\Ebene2\Ebene3\Ebene4\' break; kehrt zurück zum 2. Aufruf: 2. Zuweisung: result = 'C:\Ebene1\Ebene2\Ebene3\Ebene4\' break; kehrt zurück zum 1. Aufruf: 2. Zuweisung: result = 'C:\Ebene1\Ebene2\Ebene3\Ebene4\' break; kehrt zurück zu Deinem Aufruf, du erhälst: 'C:\Ebene1\Ebene2\Ebene3\Ebene4\' würde nun die 1. Zuweisung im 4. Aufruf fehlen erhälst du immer: '' Ich hoffe ich habe dir die Gedankengänge die zu dieser Zuweisung geführt haben etwas verdeutlichen können :coder2: |
Re: suche Funktion FindLastDir
Leider funktioniert die Funktion :mrgreen: nicht immer. Du willst doch den Pfad des am tiefsten verschachtelten Verzeichnisses haben, oder? Also benötigst Du eine Maximierung der Verschachtelungstiefen. Die fehlt hier.
Weiterhin verstehe ich nicht, wieso Du im FindFirst nur nach 'faDirectory' suchst, und dann trotzdem fragst, ob die gefundene Datei auch wirklich ein faDirectory ist... Also ich würde das weglassen. Das Break nach dem rekursiven Aufruf wird dann auch überflüssig, weil wir doch ALLE Verzeichnisse durchsuchen müssen, und nicht nur das 'erste'. Hier meine ungetestete Variante:
Delphi-Quellcode:
function FindLastDir(sDirectory : string) : string;
Var sDeepestPath : String; iMaxLevel : Integer; Procedure _DoFindLastDir (sDirectory : String; aLevel : Integer); var SearchRec : TSearchRec; begin sDirectory := IncludeTrailingPathDelimiter(sDirectory); If aLevel > iMaxLevel Then Begin // <-- wenn besuchte Tiefe > bisherige maximale Tiefe... iMaxLevel := aLevel; // <-- Dann merken wir uns diese Tiefe sDeepestPath := sDirectory; // <-- Sowie den Pfad, der uns bis hierhin gebracht hat End; if FindFirst(sDirectory + '*.*', faDirectory, SearchRec) = 0 then begin try repeat if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then _DoFindLastDir(sDirectory + SearchRec.Name, aLevel + 1); until FindNext(SearchRec) <> 0; finally FindClose(SearchRec); end; end; end; Begin iMaxLevel := -1; sDeepestPath := ''; _DoFindLastDir (sDirectory, 0); End; |
Re: suche Funktion FindLastDir
Moin,
vielleicht habe ich nicht aufmerksam genug gelesen, aber wenn ich die etwas abstrakten Anforderungen mal ignoriere und die durchscheinende Anwendungsidee betrachte, dann verstehe ich folgendes: Anders als übliche Player will der thread owner ein automatisches Abspielen von Audio-Dateien nicht über einen vom Benutzer geordneten SnapShot eines Verzeichnisbaumes steuern, sondern die physische Abfolge von Titeln unabhängig von der Tiefe der Verzeichnisstruktur heranziehen.
Code:
Nach dem Track "The Happy Whistler" soll der Track "Lyin' Eyes" gespielt werden - also ein Depth-First TreeWalk durch einen Verzeichnisbaum, bei dem die leafs die zu spielenden Tracks darstellen.
- Audio
- Best Of The 50's - Dean Martin - Memories Are Made Of This - Don Robertson - The Happy Whistler - Eagles - One Of These Nights - Lyin' Eyes - Take It To The Limit - Desperado - Tequila Sunrise Freundliche Grüße |
Re: suche Funktion FindLastDir
Zitat:
Hallo, also ganz so abstrakt sind die Anforderungen ja nicht. Grundsätzlich verwende ich das EasyListView zum darstellen der Struktur und man kann selbst durch alle Ordner zappen und irgendwas anspielen. Befinde ich mich in einem Ordner, spiele ich jetzt diesen ab und am Ende wieder zum ersten Track. Jetzt kam die Frage bei den Usern auf, ob man nicht am Ende zum nächsten Ordner springen kann und diesen dann abspielen. Das fällt bei mir so in die Art eines CD-Wechslers mit dem Unterschied, das es halt im Verzeichnisbaum auch Tiefen gibt. Mit weiteren Gedanken kam ich dann dazu, das in jedem Ordner sowie UnterOrdner als auch RestFiles liegen können, die auch automatisiert abgespielt werden müssen. Um überhaupt das Ganze zu ermöglichen, kann ich 2 Dinge tun: 1: innerhalb des ListViews gezielt die Indexe abfragen und springen, was aber immer eine Aktualisierung des Listviews zur Folge hat, also schlecht (ListView wird über FindAllFiles gefüllt) 2: Die Struktur absuchen mit Funktionen zur Pfadermittlung aber auch Funktionen für die Inhalte der wie Ordner und Files zu haben....und wenn alles richtig läuft, das PlayFile erreicht eine einmalige Aktualisierung des ListView So mal ganz unprofessionell angefangen (unfertig):
Delphi-Quellcode:
procedure FindDir;
var i:integer; aPath:string; label DirSearch; begin aPath := ExcludeTrailingPathDelimiter(PlayPath);//PlayPath merken ggf noch ändern Path := GetAudioplayerDirectory(PlayPath); //Path eine Ebene höher als PlayPath showmessage(path); DirSearch: DirLst.Clear; ListeDir(Path,DirLst); //dort alle Ordner in Stringliste holen {****nächsten Ordner unter PlayOrdner suchen und 1.Fileabspielen**************} if DirLst.Count >0 then //wenn mehr als 0 Ordner vorhanden begin for I := 0 to DirLst.Count-1 do //Ordner zählen und Play-Ordnernamen if aPath = DirLst.Strings[I] then //mit Liste vergleichen bzw suchen break; //wenn gefunden Inc(I); //Index-Nr ab Playordner um 1 erhöhen end; if (I < DirLst.Count) then //** wenn OrdnerIndex < DirLsteintraege begin if DirectoryExists(DirLst.Strings[I]) then //wenn Ordner vorhanden Path := FindLastDir(DirLst.Strings[I]); //neuen Path setzen auf tiefsten Ordner DirLst.Clear; //vom indexierten Ordner setzen FileLst.Clear; search:=true; FindAllFiles(DirLst,FileLst,Path,FileMask,false,true,true);//dort alle Ordner... search:=false; // ...und Files in Stringlisten holen,DirLst sollte //...leer bleiben da in tiefsten Ordner if FileLst.Count >0 then //wenn in Fileliste mehr als 0 Einträge begin if FileExists(FileLst.Strings[0]) then //wenn File vorhanden (1. File) begin ShowMediaFiles(listmedia,false,true); //AudioListe aktualisieren showmessage('Play in tiefster Ebene'); Play(Path,0); //dann 1.File abspielen end; end else //wenn keine Einträge in Stringliste, dann begin showmessage('kein File vorhanden in tiefster Ebene'); Goto DirSearch; end; end else if FileLst.Count >0 then //wenn erhöhter OrdnerIndex >DirLsteinträge begin //sprich kein weiterer Ordner mehr if FileExists(FileLst.Strings[0]) then //dann wenn File vorhanden (1. File) begin ShowMediaFiles(listmedia,false,true); //Audioliste aktualisieren showmessage('Play restliche Files unter Ordner'); Play(Path,0); //und 1.File abspielen end else begin //wenn Ordner und Files nicht mehr vorhanden showmessage('Loop zum ersten Ordner vom Root') fehlt noch //dann bei erstem Ordner ab MediaRoot anfangen end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:27 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