2012-04-01 2 views
5

Der folgende Code erstellt die Datei nicht immer. Soweit ich festgestellt habe, das erste Mal, dass dieser Code ausgeführt wurde, obwohl keine Ausnahme ausgelöst wird und createdFileSucceeded == true, wird die Datei nicht erstellt.Java-Datei file.createNewFile wurde nicht erstellt und es wurden keine Ausnahmen ausgelöst

betreibe ich den Code unter Windows, Java 6.

Jede Eingabe nützlich sein könnte

File file = new File(tmpDir, fileName); 

try { 
if (tmpDir == null) { 
    String environmentHomePath // = somePath; 
    tmpDir = new File(environmentHomePath, "SampleDumps"); 

    if (! tmpDir.exists() || ! tmpDir.isDirectory()) { 
    boolean mkdirSucceeded = tmpDir.mkdir(); 
    if (! mkdirSucceeded) { 
     throw new IOException("Failed creating directory: '" + tmpDir.getAbsolutePath() + "'"); 
    } 
    } 
} 

if (file.exists()) { 
    boolean deleteFileSucceeded = file.delete(); 
    if (! deleteFileSucceeded) { 
    throw new IOException("Unable to delete pre existing sample file: '" + fileName + "'"); 
    } 
} 

boolean createFileSucceeded = file.createNewFile(); 
if (! createFileSucceeded) { 
    throw new IOException("Unable to create sample file: '" + fileName + "'"); 
} 

fw = new FileWriter(file); 
bw = new BufferedWriter(fw); 

StringBuilder sb = new StringBuilder("something..."); 

bw.write(sb.toString()); 
bw.flush(); 
} 
catch (IOException ioe) { 
log.warn("Unable to file invalid sample to file: '" + fileName + "'", ioe); 
} 
finally { 
if (bw != null) { 
    try { 
    bw.close(); 
    } catch (IOException e) { 
    log.warn("Unable to close Writer to file: '" + fileName + "'", e); 
    } 
} 
else if (fw != null) { 
    try { 
    fw.close(); 
    } catch (IOException e) { 
    log.warn("Unable to close Writer to file: '" + fileName + "'", e); 
    } 
} 
} 
+0

vielleicht hat der Benutzer, der die Anwendung ausführt, nicht genug Berechtigungen, um eine Datei in diesem Verzeichnis –

+0

@LuiggiMendoza zu erstellen, aber den Code nacheinander im selben Prozess auszuführen, zum zweiten Mal erstellt die Datei. –

+1

Ich habe nicht versucht, Ihren Code auszuführen, aber ich würde vermuten, dass das Erstellen des tmpDir nach dem Erstellen der Datei, die in diesem Verzeichnis vorhanden sein soll, unerwartete Verhalten von Dateimethoden wie exists() verursachen kann. – GreyBeardedGeek

Antwort

6

Wenn file.createNewFile() kehrt true dann eine Datei erstellt wurde.

Die wahrscheinlichste Erklärung, dass die Datei erstellt wird, aber nicht an der Stelle, an der Sie erwarten. Ich gehe davon aus, dass Sie einen relativen Pfadnamen für die Datei verwenden ...


mehr Blick sorgfältig an Ihrem Code und Ihren Kommentar, ich denke, das ist genau das, was geschieht. Sehen Sie sich an, wie Sie das temporäre Verzeichnis erstellen. Sie erstellen zuerst die Datei mit tmpdir als übergeordnetes Verzeichnis. Dann testen Sie zu sehen ist tmpdir ist null und erstellen Sie ein Verzeichnis. Aber Sie fahren dann fort, das File Objekt zu verwenden, das STILL ein null Elternverzeichnis hat !!

Sie müssen das Objekt File nach Überprüfung tmpdir erstellen und es bei Bedarf erstellen.

2

Ihr Ansatz mit ist fehlerhaft. Die Datei wird erstellt irgendwo.

Aus den Javadocs für File(String, String):

Wenn Eltern null ist dann die neue Datei-Instanz erstellt wird, als ob durch die Single-Argument Datei-Konstruktor auf dem angegebenen Kind Pfadname Zeichenfolge aufzurufen.

2

Nach einigen Tests habe ich den Fehler gefunden und korrigieren:

try { 
    //create tmpDir if its null 
    if (tmpDir == null) { 
     String environmentHomePath = "D:/"; //change to somepath 
     //tmpDir must be a directory path 
     tmpDir = new File(environmentHomePath); 

     if (!tmpDir.exists() || !tmpDir.isDirectory()) { 
      boolean mkdirSucceeded = tmpDir.mkdir(); 
      if (!mkdirSucceeded) { 
       throw new IOException("Failed creating directory: '" + tmpDir.getAbsolutePath() + "'"); 
      } 
     } 
    } 
    //create the path 
    File file = new File(tmpDir, fileName); 
    if (file.exists()) { 
     boolean deleteFileSucceeded = file.delete(); 
     if (!deleteFileSucceeded) { 
      throw new IOException("Unable to delete pre existing sample file: '" + fileName + "'"); 
     } 
    } 
    boolean createFileSucceeded = file.createNewFile(); 
    if (!createFileSucceeded) { 
     throw new IOException("Unable to create sample file: '" + fileName + "'"); 
    } 

    fw = new FileWriter(file); 
    bw = new BufferedWriter(fw); 

    StringBuilder sb = new StringBuilder("something..."); 
    bw.write(sb.toString()); 
    bw.flush(); 
} catch (IOException ioe) { 
    log.warn("Unable to file invalid sample to file: '" + fileName + "'", ioe); 
} finally { 
    try { 
    if (bw != null) { 
     try { 
      bw.close(); 
     } catch (IOException e) { 
      log.warn("Unable to close Writer to file: '" + fileName + "'", e); 
     } 
    } 
    else if (fw != null) { 
     try { 
      fw.close(); 
     } catch (IOException e) { 
      log.warn("Unable to close Writer to file: '" + fileName + "'", e); 
    } 
} 
+0

@BrianRoach Ich habe meinen Test gemacht, als es keine Antworten gab, und ich habe StephenC aufgezogen, weil er der Erste war, der das Problem fand –

0

Überprüfen Sie die Dateinamen. Es sollte keinen Doppelpunkt : oder irgendein anderes ähnliches Zeichen enthalten, das Ausnahme wirft.

Verwandte Themen