2009-10-06 3 views
18

Ich habe eine Methode, die in eine Protokolldatei schreibt. Wenn die Datei existiert, sollte sie an sie angehängt werden, wenn nicht, dann möchte ich, dass sie eine neue Datei erstellt.File.createNewFile() thowing IOException Keine solche Datei oder Verzeichnis

if (!file.exists() && !file.createNewFile()) { 
    System.err.println("Error with output file: " + outFile 
     + "\nCannot create new file."); 
    continue; 
} 

Ich habe das zu überprüfen, dass eine Datei erstellt werden kann. Datei ist ein java.io.File-Objekt. createNewFile löst eine IOException aus: Keine solche Datei oder kein Verzeichnis. Diese Methode hat perfekt funktioniert, seit ich sie vor ein paar Wochen geschrieben habe und erst kürzlich damit angefangen habe, obwohl ich nicht weiß, was ich hätte ändern können. Ich habe überprüft, das Verzeichnis existiert und ich habe Schreibberechtigungen dafür, aber dann dachte ich, es sollte nur falsch zurückgeben, wenn es die Datei aus irgendeinem Grund nicht machen kann.

Gibt es etwas, das ich vermisse, damit das funktioniert?

+0

die IOException enthalten eine Nachricht oder irgendetwas anderes, das tut könnte sei hilfreich? – Glen

+1

Möglicherweise alt, aber Sie erhalten den gleichen Fehler, wenn Sie keine Schreibberechtigungen haben, an die Sie schreiben möchten. '' behebt es. –

Antwort

6

normalerweise dies etwas, das Sie kürzlich geändert ist, zunächst einmal Ihren Beispielcode, wenn nicht existiert Datei und nicht die neue Datei erstellen - Sie versuchen, weg zu codieren etwas - was ist das?

Dann sehen Sie sich eine Verzeichnisliste an, um zu sehen, ob sie tatsächlich existiert und eine println/toString() für das Dateiobjekt und getMessage() für die Exception sowie eine Druckstack-Trace ausführt.

Dann starten Sie von Null Wissen wieder und wieder Faktor aus dem Get-Go jeden Schritt, den Sie verwenden, um hier zu bekommen. Es ist wahrscheinlich ein duh, du steckst irgendwo da drin, während du Code entschlüsselst (weil es funktionierte) - du verfolgst jeden Schritt im Detail, du wirst ihn finden.

+0

Danke. Ich verbrachte eine Weile damit, alles durchzugehen und fand heraus, wo es den Pfad von einer cfg-Datei liest, es entfernte keinen Doppelpunkt. output_file: path Als ich das letzte Mal gearbeitet habe, hatte ich die cfg-Datei noch nicht erstellt, es war ein hart codierter Pfad. –

+0

@Android: Nur neugierig: Ist das anders als das, was ich in http://stackoverflow.com/questions/1525060/file-createnewfile-thowing-ioexception-no-such-file-or-directory/1525073#1525073 empfohlen? –

+0

@Hemal Pandya - Ich habe deinen Kommentar gesehen, und wie gesagt, es ist korrekt - ich habe es gerade so oft erlebt, dass ich dachte, ich könnte es besser für das Poster formulieren. @Android - erinnere mich an diese Lektion gut, lass es ständig bei dir sein. Weltklasse-Operationen wurden vollständig genug verblüfft, und zwar so oft, dass die sorgfältige Wiederherstellung eine super-kritische zentrale Fähigkeit ist, die nur mit dieser Art von Wiederherstellungsarbeit einhergeht. Verwenden Sie eine Art Feed-Forward-Archiv, mit verfügbaren Gig-Laufwerken gibt es keinen Grund, wiederherstellbare Spuren zu verlieren. –

6

Vielleicht existiert das Verzeichnis, in dem die Datei erstellt wird, nicht? oder die „Datei“ ist bereits ein Verzeichnis:

+0

Das sollte meiner Meinung nach die akzeptierte Antwort sein. –

+0

@ JorgeAntonioDíaz-Benito Ich kann mir vorstellen, dass der Upvote von dir kommt? Danke für das. –

0

ein Threading-Problem (!file.exists() && !file.createNewFile() Überprüfung und Erstellung von zusammen nicht atomar) Dies könnte.

Try (file.isFile()):

if (file.exists() && !file.isFile()){ 
    //handle directory is there 
}else if(!file.createNewFile()) { 
    //as before 
} 
+0

Haben Sie die JavaDocs für createNewFile gelesen? Überprüfen und Erstellen ist in der Tat eine atomare Operation und somit Thread-sicher. – jarnbjo

+2

file.exist() ist atomar und file.createNewFile ist atomar. Zwischen diesen beiden Aufrufen können jedoch gleichzeitige Änderungen auftreten. –

+0

Werfen Sie einen Blick auf diese Antwort: http://StackOverflow.com/Questions/1525060/File-Createnewfile-thowing-ioException-No-Such-File-Or-Directory/1525132#1525132 –

3

Nach der [java docs] (http://java.sun.com/j2se/1.5.0/docs/api/java/io/File.html#createNewFile()) createNewFile wird eine neue Datei atomar für Sie erstellen.

Atomically creates a new, empty file named by this abstract pathname if and only if a file with this name does not yet exist.

dass createNewFile Gegeben ist atomaren und wird eine bestehende Datei nicht überschreiben Sie den Code neu schreiben kann als

try { 
    if(!file.createNewFile()) { 
     System.out.println("File already exists"); 
    } 
} catch (IOException ex) { 
    System.out.println(ex); 
} 

Dieses irgendwelche Probleme Potenzial Einfädeln machen kann, Rennbedingungen usw., leichter zu erkennen.

73

versucht das übergeordnete Verzeichnis, um sicherzustellen, existiert mit:

file.getParentFile().mkdirs() 
2

Sie erhalten auf jeden Fall diese Ausnahme ‚Das System kann den Weg nicht finden spezifiziert‘

Gerade print ‚file.getAbsoluteFile()‘, dies lässt Sie wissen, was die Datei, die Sie wollten erstellen.

Diese Ausnahme tritt auf, wenn das Verzeichnis, in dem Sie die Datei erstellen, nicht existiert.

+0

Ist das anders als meine Antwort? –

+0

nein, offensichtlich nicht :) –

3

Ich denke, die Ausnahme, die Sie erhalten, ist wahrscheinlich das Ergebnis der Dateiüberprüfung der atomaren Methode file.createNewFile(). Die Methode kann nicht überprüfen, ob die Datei vorhanden ist, weil einige der übergeordneten Verzeichnisse nicht vorhanden sind oder Sie nicht berechtigt sind, auf sie zuzugreifen. Ich würde dies vorschlagen:

if (file.getParentFile() != null && !file.getParentFile().mkDirs()) { 
    // handle permission problems here 
} 
// either no parent directories there or we have created missing directories 
if (file.createNewFile() || file.isFile()) { 
    // ready to write your content 
} else { 
    // handle directory here 
} 

Wenn Sie Gleichzeitigkeit berücksichtigen, all diese Prüfungen nutzlos sind, weil in jedem Fall ein anderer Thread zu erstellen ist in der Lage, löschen oder irgendetwas anderes mit Dateien zu tun. In diesem Fall müssen Sie Dateisperren verwenden, würde ich nicht empfehlen, tun;)

0

In meinem Fall nur ein Mangel an Erlaubnis war:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Verwandte Themen