2012-04-01 10 views
5

Il seguente codice non crea sempre il file. Per quanto ho notato, la prima volta che questo codice è stato eseguito, anche se non viene lanciata alcuna eccezione e createdFileSucceeded == true, il file non viene creato.File file Java.createNewFile non creato e nessuna eccezione generata

ho eseguire il codice su Windows, Java 6.

Qualsiasi input potrebbe essere utile

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

forse l'utente che esegue l'applicazione non dispone di privilegi sufficienti per creare un file in quella directory –

+0

@LuiggiMendoza ma eseguendo il codice, consecutivamente, all'interno dello stesso processo, per la seconda volta crea il file. –

+1

Non ho provato a eseguire il codice, ma sospetto che la creazione di tmpDir dopo aver creato il file che si aspetta di esistere in quella directory potrebbe causare un comportamento imprevisto dai metodi File come exists(). – GreyBeardedGeek

risposta

6

Se file.createNewFile() ritorna true poi un file è stato creato.

La spiegazione più probabile che il file venga creato, ma non nel luogo in cui ci si aspetta. Mi aspetto che si sta utilizzando un percorso relativo per il file ...


Guardando più attentamente il codice e il tuo commento, penso che è esattamente ciò che sta accadendo. Dai un'occhiata al modo in cui crei la directory temporanea. Per prima cosa costruisci il file usando tmpdir come directory principale. Quindi prova a vedere è tmpdir è null e creare una directory. Ma si procede quindi all'utilizzo dell'oggetto File che STILL ha una directory genitore null !!

È necessario creare l'oggetto File DOPO il controllo tmpdir e crearlo se necessario.

2

L'approccio con tmpDir è errato. Il file viene creato da qualche parte.

Dalle Javadocs per File(String, String):

Se il padre è nullo allora la nuova istanza del file viene creato come se invocando l'unico argomento del costruttore file sulla data stringa bambino percorso.

2

Dopo un po 'di test, ho trovato l'errore e correggerlo:

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 Ho fatto il mio test quando non ci sono state risposte, e ho svitato StephenC perché è stato il primo a scoprire il problema –

0

Controllare il nome del file. Non dovrebbe contenere alcun colon : o qualsiasi altro carattere simile, che genera un'eccezione.

Problemi correlati