if ( file.exists() ) oder nicht?

  • Antworten:2
  • Bentwortet
Urs R.
  • Forum-Beiträge: 38

31.05.2017, 14:40:57 via Website

Guten Tag

Folgende Schleife soll beim starten "onCreate" ausgeführt werden:

        for (read = 1; read <= 10; read++) {
        FILENAME = "datei_" + String.valueOf(read) + ".txt";
        try {
            File file = new File(FILENAME);
            if (!file.exists()) {
                file.createNewFile();
            }
        } catch (IOException e) {
            Log.d(LOG_TAG, "createNewFile", e);
        }

Nach meiner Meinung sollte, wenn (!file.exists()) zutrifft, eine neue Datei mit entsprechendem Dateinamen angelegt werden. Nach Start der App stehen mir die 10 Dateien auch tatsächlich zur Verfügung.
Wenn ich die App schliesse und neu starte, wird die Ausführung mit einer IOExcepiton abgebrochen, weil die Dateien bereits vorhanden sind. Ändere ich die Abfrage von (!file...) zu (file...) startet die App normal, solange ich keine der Dateien lösche. Brauche ich zB. das File datei_5.txt nicht mehr und lösche es innerhalb der App, startet die App nicht mehr, weil eine Datei fehlt. Egal welche der beiden Abfragen ich verwende, erfolgt ein Abbruch, weil bei der einen bereits Dateien vorhanden sind, bei der andern aber eine oder mehrere Dateien fehlen. Wenn ich die App deinstalliere, muss ich mit (!file...) starten, um die Dateien zu erstellen und dann auf (file...) ändern, dass die App auch beim nächsten Start nicht abbricht. Nur eine einzelne Datei löschen, um beim nächsten Start eine neue leere Datei zu erhalten, geht nicht. Warum?
Ich blick da nicht durch.

Antworten
Ludy
  • Admin
  • Forum-Beiträge: 7.957

31.05.2017, 16:17:08 via Website

Hallo,

eine file#exist Abfrage ist nicht erforderlich, denn file#createNewFile das schon erledigt.

Dann fehlt dir noch die richtige Pfad Angabe (*getFilesDir().getPath() *), sonst gibt es ein Read-only file system

for (int read = 1; read <= 10; read++) {
    String FILENAME = getFilesDir().getPath() + "/datei_" + String.valueOf(read) + ".txt";
    try {
        File file = new File(FILENAME);
        if (file.createNewFile()) {
            Log.i(LOG_TAG, "File erstellt");
        } else {
            Log.i(LOG_TAG, "File ist schon vorhanden");
        } 
    } catch (IOException e) {
        Log.d(LOG_TAG, "createNewFile", e);
    }
}

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

☕ Buy Me A Coffee ☕

Lebensmittelwarnung-App

✨Meine Wunschliste✨

📲Telegram NextPit News📲

Pascal P.swa00

Antworten
Urs R.
  • Forum-Beiträge: 38

01.06.2017, 15:33:51 via Website

Hallo Ludi
Als Greenhorn muss man sich damit abfinden, dass nicht alles brauchbar ist, was man im Netz findet. Deine Version sieht doch schon mal sehr brauchbar aus. Ich hab das bis auf den Teil ->else{Log.i} übernommen. Wenn eine Datei neu erstellt wird, benutze ich ein Flag, das bei "File erstellt" auf true gesetzt wird. Ist 'boolean newFile = true' sollen Standardwerte zur Initialisierung eingetragen werden. Ist das Flag = false, was dem Startwert entspricht, werden die bestehenden Daten eingelesen. Das geschieht in der selben for-Schleife nach dem catch in einem 2. try-Block. Ich habe so das Erstellen der Dateien vom Einlesen der Daten getrennt.

Was ich nicht ganz verstehe ist deine Aussage, dass die richtige Pfad-Angabe fehlt. ich habe die App schon in Betrieb als mehr oder weniger Preview-Beta-Version. Das Lesen und Speichern der Daten hat bis jetzt auch ohne Pfad funktioniert. Einzig beim Erstellen neuer Dateien hatte ich Probleme. Ich nehme aber deinen Tipp zu herzen und habe den Pfad mit übernommen. Ob es jetzt funktionirt kann ich gerade noch nicht sagen, da ich an einer Erweiterung dran bin, die noch nicht kompiliert werden kann. Irgendwann am Wochenende werde ich dich über Erfolg oder Misserfolg informieren. :)

Aber danke vorerst für deine Hilfe.

Antworten