Ordner/Unterordner nach Dateien durchsuchen

  • GM 7
  • Ordner/Unterordner nach Dateien durchsuchen

    Also ich sitze jetzt schon seit ca. 4 Stunden vor folgendem Problem:

    Ich möchte gerne, dass alle mp3-Dateien eines bestimmten Ordners (inkl. mp3-Dateien aus den Unterordnern) in eine Liste abgespeichert werden.
    Dazu habe ich mir das Script "mp3_list" programmiert, was rekursiv aufgerufen werden soll.

    GML-Quellcode

    1. list = ds_list_create();
    2. file = file_find_first(argument0+"\*",fa_directory)
    3. while(file != "")
    4. {
    5. if(file != "." && file != "..")
    6. {
    7. //Ist file ein Ordner, so füge der Liste die Liste aus diesem Ordner hinzu
    8. if(directory_exists(argument0+"\"+file))
    9. {add_list(list,mp3_list(argument0+"\"+file,true));}
    10. //Ist file eine mp3-Datei, so füge sie in die Liste ein
    11. if(filename_ext(file) == ".mp3" || filename_ext(file) == ".MP3")
    12. {ds_list_add(list,argument0+"\"+file);}
    13. }
    14. file = file_find_next();
    15. }
    16. file_find_close();
    17. return list;
    Alles anzeigen


    Zum Testen habe ich einen Ordner "Ordner" in dem zwei Ordner "OrdnerA" und "OrdnerB" und eine mp3-Datei enthalten ist.
    Desweiteren ist in "OrdnerA" und "OrdnerB" auch jeweils eine mp3-Datei drin.

    Also sollte insgesamt nacher 3 Dateien in der Liste abgespeichert sein.
    Es befindet sich nach dem Aufruf des Scripts aber nur eine Datei in der Liste, und zwar die aus dem "OrdnerA".

    Wo liegt der Fehler?
    Ich hoffe, dass sich jemand die Mühe macht, mein Script zu verstehen und mir helfen kann.
    Wahrscheinlich ist das Problem viel einfacher, als es aussieht...

    €dit: Die Methode "add_list(argument0,argument1)" habe ich selbst geschrieben und fügt einfach die zwei Listen "argument0" und "argument1'" zusammen zu "argument0".
    Diese Methode ist getestet und funktioniert. Daran kann es also nicht liegen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Basti ()

  • Das Problem was du hast ist wirklich einfach.
    Es ist nämlich so, dass eine Variable, die du in einem script initialisiertst in das Objekt gelegt wird, dass das script ausführt. Spirch: Deine Varialbe liste liegt dem Objekt, dass das script ausführt. Wenn das script bei Zeile 10 ankommt wird es neu ausgeführt. Das neu ausgeführte Script überschreibt die Variable, die die andere Liste speichert, da es ja selbst eine Variable liste im Objekt initialisiert. Damit sind dann sämtliche bisherigen Einträge verloren gegangen.
    Du musst also nur dafür sorgen, dass immer eine andere Variable für deine Liste initialisiert wird (z.B. mit einem Array)

    MfG
    Dustboy
    Dies ist eine kreative Signatur: Stell dir genau JETZT etwas lustigs vor, das hier stehen könnte...

    Meine Homepage
  • Na ja das hat den Vorteil, dass du die Variablen in einem Objekt mittels eines Scripts maipulieren kannst ;)

    Zu deinem Problem: Ich geh einfach mal davon aus, dass dein Script add_list nicht mehr macht als den Inhalt der liste argument1 an den Inhalt den liste argument0 anhängt. In dem Fall könntest du einfach die Variable list außerhalb des scriptes initialisieren (wegen mir ein einem neuen script was lediglich die Variable initialisiert und dann dieses Script aufruft. Das würde dann auch die Funktion add_list unnötig machen.

    Noch ein weiteres Problem fällt mir da grad auf: Mit deiner suche wirst du das gleiche Problem haben. Daher wäre es am Besten wenn du erst alle Ordner des Aktuellen Ordners in eine temporäre liste speicherst und die am Schluss abarbeitest.
    Dies ist eine kreative Signatur: Stell dir genau JETZT etwas lustigs vor, das hier stehen könnte...

    Meine Homepage
  • Naja ob das so ein Vorteil ist, ich weiß nicht.
    Solche Variablen var von dem Objekt obj würde ich dann lieber mit obj.var oder so ansprechen.
    Aber darum geht es ja jetzt nicht.

    Wennn ich aber alle Ordner in eine Liste speichern möchte, dann muss ich dass doch rekursiv machen, da jeder Unterordner ja wieder Unterordner haben kann.
    Nur so wie ich das verstanden habe ist Rekursion so gut wie unmöglich, da ja kein script seine "eigenen" Variablen haben darf...
  • Hab mal vor längerer Zeit was ähnliches gemacht vll. hilft dir das von der grundidee her:

    GML-Quellcode

    1. // scr_scansubdirs(dir,list to save to)
    2. var f,d,sub;
    3. sub=''
    4. f=file_find_first(argument0+'\*.*',noone)
    5. while (f!='')
    6. {
    7. if (string_lower(filename_ext(f))='.mp3')
    8. || (string_lower(filename_ext(f))='.wma')
    9. || (string_lower(filename_ext(f))='.ogg')
    10. || (string_lower(filename_ext(f))='.wav')
    11. {
    12. ds_list_add(argument1,argument0+'\'+f)
    13. }
    14. else if (string_lower(filename_ext(f))=''&&filename_name(f)!='..'&&filename_name(f)!='.')
    15. {
    16. sub+=argument0+'\'+f+'|'
    17. }
    18. f=file_find_next()
    19. }
    20. while (string_count('|',sub))
    21. {
    22. scr_scansubdirs(string_copy(sub,1,string_pos('|',sub)-1),argument1)
    23. sub=string_delete(sub,1,string_pos('|',sub))
    24. }
    Alles anzeigen


    Speichert gefundene Unterordner in einer Variable mit Trennzeichen | und führt dann im selben Skript nochmal dasselbe im ausgewählten unterordner aus.

    © 2008 by Teamgrill Productions
  • Doch noch nicht ganz perfekt...
    Wenn in einem Ordnernamen ein . (Punkt) drin ist, dann wird dieser übersprungen.
    (z.B. "Bravo Hits vol. 34")

    Aber wenn man statt

    GML-Quellcode

    1. string_lower(filename_ext(f))=''

    besser

    GML-Quellcode

    1. directory_exists(argument0+'\'+f)


    dann gehts.
    Danke nochmal!