AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

suche Funktion FindLastDir

Ein Thema von bluescreen25 · begonnen am 11. Nov 2007 · letzter Beitrag vom 16. Nov 2007
Antwort Antwort
Seite 2 von 3     12 3      
C.Schoch

Registriert seit: 2. Jan 2006
Ort: Wüstenrot
235 Beiträge
 
Turbo Delphi für Win32
 
#11

Re: suche Funktion FindLastDir

  Alt 12. Nov 2007, 19:15
Hi,
Dafür gibts doch schon einen Funktion in der Codelib ich meine die nennt sich FindAllFilesFindAllFiles.
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
Tschau Christian
Das System hofft auf Besserung
[Siemens]
  Mit Zitat antworten Zitat
bluescreen25

Registriert seit: 27. Nov 2005
Ort: Geldern
229 Beiträge
 
Delphi 7 Enterprise
 
#12

Re: suche Funktion FindLastDir

  Alt 12. Nov 2007, 20:44
Zitat von C.Schoch:
Hi,
Dafür gibts doch schon einen Funktion in der Codelib ich meine die nennt sich FindAllFilesFindAllFiles.
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
Ich denke Findfirst muss dafür herhalten, muss mir mal ein paar Einzelfunktionen basteln...
...und ich dachte, Delphi ist ein Programmgenerator mit nur einem Button......tzzz
  Mit Zitat antworten Zitat
Nuclear-Ping
(Gast)

n/a Beiträge
 
#13

Re: suche Funktion FindLastDir

  Alt 12. Nov 2007, 21:29
Warum nur FindFirst? Was ist wenn das Verzeichnis mehrere Unterverzeichnisse hat?
  Mit Zitat antworten Zitat
bluescreen25

Registriert seit: 27. Nov 2005
Ort: Geldern
229 Beiträge
 
Delphi 7 Enterprise
 
#14

Re: suche Funktion FindLastDir

  Alt 12. Nov 2007, 21:55
Zitat von Nuclear-Ping:
Warum nur FindFirst? Was ist wenn das Verzeichnis mehrere Unterverzeichnisse hat?
Ich meinte Findfirst & CO

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
...und ich dachte, Delphi ist ein Programmgenerator mit nur einem Button......tzzz
  Mit Zitat antworten Zitat
C.Schoch

Registriert seit: 2. Jan 2006
Ort: Wüstenrot
235 Beiträge
 
Turbo Delphi für Win32
 
#15

Re: suche Funktion FindLastDir

  Alt 13. Nov 2007, 18:47
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:
  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;
Edit: Absichtlich nicht kommentiert versuch selbst herauszufinden wie und warum, bei Fragen her damit
Tschau Christian
Das System hofft auf Besserung
[Siemens]
  Mit Zitat antworten Zitat
bluescreen25

Registriert seit: 27. Nov 2005
Ort: Geldern
229 Beiträge
 
Delphi 7 Enterprise
 
#16

Re: suche Funktion FindLastDir

  Alt 14. Nov 2007, 15:47
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..

Zitat von C.Schoch:
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:
  function FindLastDir(sDirectory : string) : string;
  var
    SearchRec : TSearchRec;
  begin
    sDirectory := IncludeTrailingPathDelimiter(sDirectory); //Path mit Slash versehen,falls fehlt
    result := sDirectory; //das fehlte in meinen Versuchen ??? kannste mir sagen warum ich hier eine Rückgabe liefern muss ?
    if FindFirst(sDirectory + '*.*', faDirectory, SearchRec) = 0 then// wenn ersten Eintrag gefunden
    begin
      try
        repeat //Schleife wenn Path eine Dir ist
          if ((SearchRec.Attr and faDirectory) = faDirectory) and(SearchRec.Name <> '.') and
          (SearchRec.Name <> '..') then
          begin //erste Dir als Path zurückgeben, soweit war ich auch
                          //Verschachtelung erneuter Aufruf der Funktion, immer 1 in die Tiefe
            result := FindLastDir(sDirectory + SearchRec.Name);
            break; //Abbruch wenn 1 gefunden
          end;
        until FindNext(SearchRec) <> 0; //bis Findnext 0 liefert
      finally
        FindClose(SearchRec);
      end;
    end;
  end;
Edit: Absichtlich nicht kommentiert versuch selbst herauszufinden wie und warum, bei Fragen her damit
Gruß, bluescreen25
...und ich dachte, Delphi ist ein Programmgenerator mit nur einem Button......tzzz
  Mit Zitat antworten Zitat
C.Schoch

Registriert seit: 2. Jan 2006
Ort: Wüstenrot
235 Beiträge
 
Turbo Delphi für Win32
 
#17

Re: suche Funktion FindLastDir

  Alt 14. Nov 2007, 23:05
Zitat von bluescreen25:
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..
Delphi-Quellcode:
  function FindLastDir(sDirectory : string) : string;
  var
    SearchRec : TSearchRec;
  begin
    sDirectory := IncludeTrailingPathDelimiter(sDirectory);
    result := sDirectory; //Hier wird dem result der aufrufende String zugewiesen, da sonst immer ein leerer String zurückgegeben wird --> Siehe Erklärung unten
    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;
Gruß, bluescreen25
Die Funktion ist rekursiv.

Angenommen ich habe einen Verzeichnisbaum der so aussieht,
Zitat:
C:\Ebene1\Ebene2\Ebene3\Ebene4\
Ich rufe meine Funktion so auf:
FindLastDir('C:\Ebene1')
Code:
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: ''
Daraus folgt der Rückgaberwert der Funktion ist immer der im letzten Aufruf ermittelt String.

Ich hoffe ich habe dir die Gedankengänge die zu dieser Zuweisung geführt haben etwas verdeutlichen können
Tschau Christian
Das System hofft auf Besserung
[Siemens]
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#18

Re: suche Funktion FindLastDir

  Alt 15. Nov 2007, 06:58
Leider funktioniert die Funktion 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;
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#19

Re: suche Funktion FindLastDir

  Alt 15. Nov 2007, 08:12
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:
- 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
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.

Freundliche Grüße
  Mit Zitat antworten Zitat
bluescreen25

Registriert seit: 27. Nov 2005
Ort: Geldern
229 Beiträge
 
Delphi 7 Enterprise
 
#20

Re: suche Funktion FindLastDir

  Alt 15. Nov 2007, 14:09
Zitat von marabu:
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:
- 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
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.

Freundliche Grüße
So wie du es oben darstellst, soll es sein, wenn du noch einzelne Files z.B. in Eagles\berücksichtigst sowie eine Maximalgrenze nach oben, ich biete da mal das festgelegte Rootverzeichnis "Audio" an. Ist "Tequila Sunrise" abgespielt, sollte er wieder oben anfangen bzw er geht nach "Dean Martin" durch die Tiefen-Funtion.

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;
...und ich dachte, Delphi ist ein Programmgenerator mit nur einem Button......tzzz
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:24 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