txt-Files

  • GM 7

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

  • Also ich suche mittels "file_find_next()" alle txt-Dateien in einem Ordner.
    Sobald immer eine gefunden wird, soll aber direkt überprüft werden, ob eine bestimmte Zeile in der txt erhalten ist.
    Dazu muss ich diese aber zum lesen öffnen. Doch dafür brauche ich den Namen der txt-Datei und "file_find_next()" gibt nur die ID zurück.
    Jedenfalls kann ich die nicht öffnen, wenn ich sowas hier mache:

    GML-Quellcode

    1. next = file_find_next();
    2. file_text_open_read(next);


    Dann bekomme ich danach einen Fehler, dass ich die Datei nicht geöffnet habe, um zu lesen.

    Was mache ich falsch?
  • filename_name(fname) Gibt den Namen der Datei mit Erweiterung aber ohne Pfad wieder.
    filename_path(fname) Gibt den Pfad der Datei inklusive des finalen Backslashs zurück.
    filename_dir(fname) Gibt das Verzeichnis der Datei zurück, welches normalerweise der Pfad ohne den finalen Backslash ist.
    filename_drive(fname) Gibt das Laufwerk der Datei zurück.
    filename_ext(fname) Gibt die Dateierweiterung wieder, inklusive des Punktes.
    filename_change_ext(fname,newext) Gibt den angegebenen Dateinamen, mit der Erweiterung an (inklusive des Punktes), welche zu einer neuen Erweiterung verändert wurde. Indem ein leerer string angegeben wird kann die Erweiterung gelöscht werden.
  • Vielen vielen Dank! So gehts! ;)


    €dit: Geht doch nur halb!
    Also in dem Ordner, wo ich das Spiel drin gespeichert habe, geht es ohne Probleme. Doch wenn ich zum testen mal den Desktop nehme, dann bekomme ich wieder den Fehler!
    Speicher ich das Spiel allerdings auf dem Desktop, so geht es, wenn ich den Desktop durchsuchen lasse, aber die anderen Ordner dann nicht mehr!

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

  • Basti schrieb:

    Also ich suche mittels "file_find_next()" alle txt-Dateien in einem Ordner.
    Sobald immer eine gefunden wird, soll aber direkt überprüft werden, ob eine bestimmte Zeile in der txt erhalten ist.
    Dazu muss ich diese aber zum lesen öffnen. Doch dafür brauche ich den Namen der txt-Datei und "file_find_next()" gibt nur die ID zurück.
    Jedenfalls kann ich die nicht öffnen, wenn ich sowas hier mache:

    GML-Quellcode

    1. next = file_find_next();
    2. file_text_open_read(next);


    Dann bekomme ich danach einen Fehler, dass ich die Datei nicht geöffnet habe, um zu lesen.

    Was mache ich falsch?


    fabse64 schrieb:

    1. Das filename_name() ist unnötig, da file_find_next() keinen kompletten Pfad zurückgibt.
    2.:

    GML-Quellcode

    1. var file;
    2. next = file_find_next();
    3. file = file_text_open_read(next);
    4. file_text_read_string(file);
    MfG,
    -fabse64


    Also ich sehe außer der Formatierung und file_text_read_string(file) keinen Unterschied!
  • Da brauch dir auch keiner zu antworten. Kannst ja mal die Suche ausprobieren.
    Ein Tipp: Durchsuch erst den Ordner nach Ordnern, bis du im untersten Verzeichnis bist, dann gehst du da die Textdateien durch. Dann widerum in das übergeordnete Verzeichnis und dort die Textdateien durchsuchen und so weiter.
  • Ok, hab ich soweit verstanden...
    Jedoch wie finde ich Ordner?

    Also mit

    GML-Quellcode

    1. file_find_first(ordner+"/*",fa_directory;)
    wird alles gefunden, was in diesem Ordner drin ist.
    Also auch die Dateien.
    Aber ich dachte durch "fa_directory" wird gesagt, dass nur Ordner gefunden werden sollen!?

    Die ersten zwei Sachen die gefunden werden sind immer ein Punkt (.) und als zweites zwei Punkte (..)
    Was ist das?
  • Aber ich dachte durch "fa_directory" wird gesagt, dass nur Ordner gefunden werden sollen!?

    Nein, das zweite Argument bei "file_find_first" gibt an, was zusätzlich gefunden werden soll. Um nur die gefundenen Ordner zu beachten, kannst du ja einfach mit "directory_exists" prüfen, ob es sich wirklich um einen Ordner und nicht um eine Datei handelt.

    Die ersten zwei Sachen die gefunden werden sind immer ein Punkt (.) und als zweites zwei Punkte (..)
    Was ist das?

    Das sind auch Ordner in einem anderen Sinn. "." steht für den aktuellen Ordner und ".." steht für den relativ gesehen übergeordneten Ordner. z.B. sind ".\ordner1" und "ordner1" gleichwertige Pfadangaben, genauso wie "ordner1\..\ordner2" und "ordner2". Beim durchlaufen der Ordner und Dateien kannst du also "." und ".." einfach ignorieren.
  • Also ich hab das jetzt so gemacht, dass der erst die Ordner alle durchgeht bis in den Untersten, und dann da die txt Dateien zählt und sich weiter hocharbeitet.

    Jedoch klappt das nicht so ganz. Der zählt nur die txt-Dateien im überordner, als der ordner, der angegeben wird.

    Das ist meine Funktion (search_dir), die die Ordner durchgeht. (argument0 ist der Überordner):

    GML-Quellcode

    1. dir = file_find_first(argument0+"/*",fa_directory);
    2. returnwert = 0;
    3. while(string_copy(dir,0,1) == ".")
    4. {dir = file_find_next();}
    5. while(dir != "")
    6. {
    7. while(dir != "" && !directory_exists(argument0+"/"+dir))
    8. {dir = file_find_next();}
    9. returnwert = search_dir(dir) + count_txt(argument0);
    10. dir = file_find_next();
    11. }
    12. if(returnwert == 0)
    13. {returnwert = count_txt(argument0);}
    14. file_find_close();
    15. return returnwert;
    Alles anzeigen


    Das ist meine Funkton count_txt, die die txt-Dateien zählt und zurückgibt:

    GML-Quellcode

    1. files = 0;
    2. txt_file = file_find_first(argument0 + "/*.txt",0);
    3. while(txt_file != "")
    4. {
    5. if(pruefe_txt(argument0,txt_file))
    6. {files += 1;}
    7. txt_file = file_find_next();
    8. }
    9. return files;
    Alles anzeigen


    pruefe_txt() prüft nur, ob die txt-Dateien etwas bestimmtes enthalten. Zum testen gibt die Funktion immer true zurück.

    Wo liegt mein Fehler?
  • Ich kann dir jetzt nicht genau sagen was da falsch ist, aber hier sind mal zwei Skripte, die ich immer verwende um alle Dateien zu finden:

    find_files(Ordner,Dateiendung)

    GML-Quellcode

    1. {
    2. var ls;
    3. ls=ds_list_create();
    4. return find(argument0,argument1,ls);
    5. }


    find()

    GML-Quellcode

    1. {
    2. var file,ls,i;
    3. ls=ds_list_create();
    4. file=file_find_first(argument0+"\*",fa_directory)
    5. do
    6. {
    7. if(directory_exists(file))&&(file!=".")&&(file!="..")
    8. {
    9. ds_list_add(ls,file);
    10. }
    11. if(filename_ext(file)==argument1)
    12. {
    13. ds_list_add(argument2,file);
    14. }
    15. file=file_find_next();
    16. }
    17. until(file=="")
    18. file_find_close();
    19. for(i=0;i<ds_list_size(ls);i+=1)
    20. {
    21. find(ds_list_find_value(ls,i),argument1,argument2);
    22. }
    23. ds_list_destroy(ls);
    24. }
    Alles anzeigen


    Du rufst einfach find_files(...) auf und bekommst ne Liste mit allen Dateien zurück. Hier noch ein Beispiel:

    GML-Quellcode

    1. var ls;
    2. ls=find_files(working_directory,".txt");
    3. /*
    4. Hier kannst du nun alle Dateien aus der Liste auslesen...
    5. */
    6. ds_list_destroy(ls); //Liste löschen wenn sie nicht mehr gebraucht wird
    int (*x(*x(int))[5])(int*);
    Confused? Yes, it's C!
  • Ok, die funktioniert.
    Aber warum geht das nicht, wenn ich das so mache:

    GML-Quellcode

    1. ordner = get_directory(working_directory);
    2. liste = search_dir(ordner,".txt");


    Wenn ich dann im Draw-Event folgendes habe:

    GML-Quellcode

    1. if(!ds_list_empty(liste))
    2. {draw_text(50,50,ds_list_size(liste));}


    dann ist die immer leer, denn es wird nichts gedrawed.

    Was mir allerdings gerade auffällt:
    Die Liste ist nur leer, wenn ich einen anderen Ordner auswähle! Ist der Ordner der "working_directory" Ordner, dann geht es... :S