file_find - Ordner oder Datei?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • file_find - Ordner oder Datei?

    Hi Leute!!!

    Ich hab da ein Problem mit den file_find Funktionen:

    Ich lese erstmal in einem Ordner alle Dateien/Ordner aus.
    Ungefähr so:

    GML-Quellcode

    1. dat=file_find_first(path+"\*.*",noone);
    2. while(dat!="")
    3. {
    4. file[counter]=filename_name(dat);
    5. if counter>=2
    6. {
    7. //Sonst macht der am Anfang noch zwei nur aus Punkten
    8. inst=instance_create(xx,yy,obj_file);
    9. if xx<432
    10. {xx+=29;}
    11. else
    12. {xx=260; yy+=29; global.zeilen+=1;}
    13. //Hier kommt mein Problem... siehe unten ^^ hier soll das Object rausfinden, worum es sich handelt, und das dann obj_file "weitergeben"
    14. inst.dat=filename_name(file[counter]);
    15. }
    16. counter+=1;
    17. dat=file_find_next();
    18. }
    19. file_find_close();
    20. search=false;
    21. dat="";
    Alles anzeigen


    So:
    Wie mache ich jetzt, dass das Object erkennt, ob es sich um einen Ordner oder eine Datei handelt?
    Noch besser:
    Wie mache ich es, dass das Object erst nach Ordnern und danach nach ALLEN ANDEREN Dateien sucht?
  • Du verwendest die benötigte Funktion schon selber, es handelt sich um file_find_first(). In der Hilfe steht, dass das zweite Argument auch fa_directory sein kann. Damit findest du alle Ordner. Wie du die anderen Dateien dann findest, weiß ich jetzt auch nicht, vielleicht schreibst du die Ordner erst in eine Liste, gehst dann alle Dateien durch, und wenn die schon in dieser Liste sind, werden sie übersprungen.

    Alternativ:
    Die funktion file_attributes(path,fa_directory) sagt dir, ob die Datei ein Ordner ist oder nicht.
    “Computers are good at following instructions, but not at reading your mind.” (Donald Knuth)

    Ich schreibe mit Neo.
  • ALSO:
    Ich hab das erstmal damit gemacht:

    obj_controller (der, der den Code oben ausführt)

    GML-Quellcode

    1. if file_attributes(file[counter],fa_directory)
    2. {inst.type="ordner";}
    3. else
    4. {inst.type="";}

    (Das hab ich da reingesetzt, wo ich oben das Problem Kommentiert habe)

    obj_file:

    GML-Quellcode

    1. if type="ordner"
    2. {image_index=0}
    3. else
    4. {image_index=1}

    Aber das funktioniert nicht... ;(
    vielleicht schreibst du die Ordner erst in eine Liste, gehst dann alle Dateien durch, und wenn die schon in dieser Liste sind, werden sie übersprungen
    Wie denn?


    €dit:
    Hab das mal ausprobiert und es gibt auch jede Datei nur einmal, aber irgendwie ist das immer noch falsch:
    Spoiler anzeigen

    GML-Quellcode

    1. if search
    2. {
    3. dat=file_find_first(path+"\*.*",fa_directory);
    4. i=ds_list_create()
    5. while(dat!="")
    6. {
    7. ds_list_add(i,string(dat))
    8. file[counter]=filename_name(dat);
    9. if counter>=2
    10. {
    11. inst=instance_create(xx,yy,obj_file);
    12. if xx<432
    13. {xx+=29;}
    14. else
    15. {xx=260; yy+=29; global.zeilen+=1;}
    16. inst.dat=filename_name(file[counter]);
    17. }
    18. counter+=1;
    19. dat=file_find_next();
    20. }
    21. file_find_close();
    22. dat=file_find_first(path+"\*.*",noone);
    23. while(dat!="")
    24. {
    25. if ds_list_find_index(i,string(dat))=-1
    26. {
    27. file[counter]=filename_name(dat);
    28. if counter>=2
    29. {
    30. inst=instance_create(xx,yy,obj_file);
    31. if xx<432
    32. {xx+=29;}
    33. else
    34. {xx=260; yy+=29; global.zeilen+=1;}
    35. inst.type="ordner"
    36. inst.dat=filename_name(file[counter]);
    37. }
    38. counter+=1;
    39. }
    40. dat=file_find_next();
    41. }
    42. file_find_close();
    43. search=false;
    44. dat="";
    45. }
    Alles anzeigen

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

  • In deinem ersten Post in Zeile 4 setzt du file[counter] auf den Namen der Datei, du brauchst aber für file_attributes den kompletten Pfad.
    Außerdem schreibst du weiter unten dann nochmal filename_name wobei du schon den Namen in der Variable hast, ist also doppelt und unnötig.
  • So geht das aber auch nicht:

    GML-Quellcode

    1. if file_attributes(dat,fa_directory)
    2. {inst.type="ordner";}


    Nochmal das, was ich gerade hab:
    Spoiler anzeigen

    GML-Quellcode

    1. if search
    2. {
    3. dat=file_find_first(path+"\*.*",noone);
    4. while(dat!="")
    5. {
    6. file[counter]=filename_name(dat);
    7. if counter>=2
    8. {
    9. //Sonst macht der am Anfang noch zwei nur aus Punkten
    10. inst=instance_create(xx,yy,obj_file);
    11. if xx<432
    12. {xx+=29;}
    13. else
    14. {xx=260; yy+=29; global.zeilen+=1;}
    15. if file_attributes(dat,fa_directory)
    16. {inst.type="ordner";}
    17. inst.dat=file[counter];
    18. }
    19. counter+=1;
    20. dat=file_find_next();
    21. }
    22. file_find_close();
    23. search=false;
    24. dat="";
    25. }
    Alles anzeigen
  • Sry falls ich grade nicht richtig am Platz bin aber ich bin zu Faul mir alles durchzulesen...
    Du willst Ordner und Dateien haben??
    So wirds gemacht:
    file_find - Dateien
    file_find - Argument: fa_directory - Dateien UND Ordner
    Wenn schon in Dateien: Überspringe.
    Das sieht dann etwa so aus:
    Spoiler anzeigen

    GML-Quellcode

    1. dir = "C:\";
    2. list_files = ds_list_create();
    3. list_dirs = ds_list_create();
    4. file = file_find_first(dir+'*',0);
    5. if (file != "") {
    6. ds_list_add(list_files,file);
    7. while (1) {
    8. file = file_find_next();
    9. if (file != "") {ds_list_add(list_files,file);}
    10. else {break;}
    11. }
    12. }
    13. file_find_close();
    14. file = file_find_first(dir+'*',fa_directory);
    15. if (file != "") {
    16. if (ds_list_find_index(list_files,file) = -1) &&
    17. (file != ".") && (file != "..")
    18. {ds_list_add(list_dirs,file);}
    19. while (1) {
    20. file = file_find_next();
    21. if (file != "") {
    22. if (ds_list_find_index(list_files,file) = -1) &&
    23. (file != ".") && (file != "..")
    24. {ds_list_add(list_dirs,file);}
    25. } else {break;}
    26. }
    27. }
    28. file_find_close();
    Alles anzeigen


    Dann haste 2 Listen mit 1 x Dateien und 1 x Ordnern.

    EDIT: LOL! Wird net angezeigt... klick ma auf Quote dann sieht es ^^
  • Klar geht das!

    Du speicherst alles in arrays und erst dann machst du mit den Dateien und Ordnern das, was du machen möchtest (z.B.: anzeigen ^^ )

    global.ordner[1] => der Name des ersten Ordners
    global.ordner[2] => der Name des zweiten Ordners
    global.ordner[3] => der Name des dritten Ordners

    global.datei[1] => der Name der ersten Datei
    global.datei[2] => der Name der zweiten Datei
    global.datei[3] => der Name der dritten Datei

    cya,
    swffilms
  • Hä...???
    Das hab ich jetzt iwie nicht verstanden...
    Weder Tobi noch swffilms... ?( :pinch: :rolleyes: :D

    Ich versuchs trotzdem...
    Ok, es ist glaube ich NICHT möglich Ordner allein zu suchen, du musst die Dateien so oder so suchen, dann die Dateien UND Ordner (+ fa_directory) und alle Dateien filtern (d.h. alle die schon in der ersten Liste sind). Danach hast du 2 Listen, eine mit allen Dateien (ob du sie brauchst oder nicht - sie ist da) und eine mit den Ordnern.
    Falls du nicht weist, was Listen sind und wie man damit umgeht, hilft dir die Hilfe weiter ;)

    @ swffilms: Die Listen sind im Gegensatz zu den Arrays ganz praktisch, weil man in ihnen nach einem bestimmten Wert gucken kann, und das brauch man um die Dateien zu filtern.
    Mit ds_list_find_value(list_dirs,i) kriegst du genau das gleiche dann raus wie mit global.ordner ;)
  • Noch nicht ganz gelößt:
    Ich hatte jetzt eigendlich vor, den Code so zu lassen, aber wenn ich jetzt C: auslese hab ich in den Listen so etwa 5 Dateien und 5 oder 6 Ordner.
    Guck ich aber über den Arbeitsplatz hab ich da viel mehr (z.B. die .sqm Dateien...die brauch ich zwar nicht, aber ich möchte alle anzeigen lassen).

    Weiß da jemand warum?
  • noone ist eine Art "spezielles Objekt" und wird von einigen Funktionen zurückgegeben wenn kein Objekt gefunden wurde...
    Naja, wenn du alle Dateien (Ordner dann noch "+fa_directory") finden willst muss das in etwa so aussehen:

    Quellcode

    1. file_find_first(fa_readonly+fa_hidden+fa_sysfile+fa_volumeid+fa_archive);