2009-10-06 10 views
18

Ho un metodo che scrive in un file di registro. Se il file esiste dovrebbe aggiungerlo, se no, allora voglio che crei un nuovo file.File.createNewFile() thowing IOException Nessun file o directory di questo tipo

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

Ho quello di verificare che un file può essere creato. il file è un oggetto java.io.File. createNewFile lancia una IOException: nessun file o directory di questo tipo. Questo metodo ha funzionato perfettamente da quando l'ho scritto poche settimane fa e solo di recente ho iniziato a farlo anche se non so cosa avrei potuto cambiare. Ho controllato, la directory esiste e ho i permessi di scrittura per questo, ma poi ho pensato che dovrebbe restituire false se non può rendere il file per qualsiasi motivo.

C'è qualcosa che mi manca per farlo funzionare?

+0

Condivide l'IOException contengono un messaggio o qualsiasi altra cosa che potrebbe Sii utile? – Glen

+1

Può essere vecchio, ma si otterrebbe lo stesso errore se non si dispone delle autorizzazioni per scrivere dove si desidera scrivere. '' lo risolve. –

risposta

6

normalmente questo è qualcosa che si è cambiato di recente, prima di tutto il codice di esempio è se non il file esiste e non creare un nuovo file - si sta tentando di codice via qualcosa - cos'è?

Quindi, guardare un elenco di directory per vedere se esiste effettivamente e fare un println/toString() sull'oggetto file e getMessage() sull'eccezione, nonché stampare traccia dello stack.

Quindi, ricominciare da zero conoscenza e ri-fattore dal get-go ogni passo che si sta utilizzando per arrivare qui. Probabilmente è un duh che hai bloccato lì da qualche parte mentre concettualizzi nel codice (perché stava funzionando) - devi solo ripercorrere ogni passaggio in dettaglio, lo troverai.

+0

Grazie. Ho passato un po 'di tempo indietro a tutto e ho trovato dove legge il percorso da un file cfg che non rimuoveva i due punti. output_file: path Quando era l'ultima volta che lavoro non avevo ancora fatto il file cfg, era un percorso hard coded. –

+0

@Android: solo curioso: è diverso da quello che ho consigliato in http://stackoverflow.com/questions/1525060/file-createnewfile-thowing-ioexception-no-such-file-or-directory/1525073#1525073? –

+0

@Hemal Pandya - Ho visto il tuo commento, e come notato è corretto - ho appena passato così tante volte ho pensato di poterlo esprimere meglio per il poster. @Android - ricorda bene questa lezione, lascia che sia costantemente con te. Le operazioni di classe mondiale sono state completamente confuse da questo un numero sufficiente di volte che il recupero accuratamente elaborato è un'abilità centrale super-critica, che viene solo con questo tipo di lavoro di recupero. Utilizzare un qualche tipo di archivio Feed-Forward, con le unità gig disponibili a portata di mano, non vi è alcun motivo per perdere tracce recuperabili. –

6

Forse la directory in cui si sta creando il file non esiste?

+0

Questa dovrebbe essere la risposta accettata secondo me. –

+0

@ JorgeAntonioDíaz-Benito Immagino che l'upvote sia da parte tua? Grazie per questo. –

0

Questo potrebbe essere un problema di threading (controllo e creando insieme non sono atomiche: !file.exists() && !file.createNewFile()) o il "file" è già una directory.

Try (file.isFile()):

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

Hai letto JavaDocs per createNewFile? Il controllo e la creazione sono in effetti un'operazione atomica e quindi thread-safe. – jarnbjo

+2

file.exist() è atomico e file.createNewFile è atomico. Ma tra queste due chiamate possono verificarsi cambiamenti concomitanti. –

+0

dai un'occhiata a questa risposta: http://stackoverflow.com/questions/1525060/file-createnewfile-thowing-ioexception-no-such-file-or-directory/1525132#1525132 –

3

Secondo i documenti [java] (http://java.sun.com/j2se/1.5.0/docs/api/java/io/File.html#createNewFile()) createNewFile creerà un nuovo file di atomicamente per voi.

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

Dato che createNewFile è atomico e non saranno sovrascrivere un file esistente è possibile ri-scrivere il codice come

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

Questo può rendere i potenziali problemi di threading, race-condizioni , ecc., più facile da individuare.

73

cercare di garantire la directory padre esiste con:

file.getParentFile().mkdirs() 
2

vi sono certamente ottenendo questa eccezione 'Il sistema non riesce a trovare il percorso specificato'

Proprio di stampa 'file.getAbsoluteFile()', questo vi permetterà di sapere che cosa è il file che si voleva creare.

Questa eccezione si verificherà se la directory in cui si sta creando il file non esiste.

+0

È diverso dalla mia risposta? –

+0

no, ovviamente no :) –

3

Penso che l'eccezione che si ottiene sia probabilmente il risultato del controllo file del metodo atomico file.createNewFile(). Il metodo non può verificare se il file esiste perché alcune directory padre non esistono o non si dispone delle autorizzazioni per accedervi. Vorrei suggerire questo:

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 
} 

Se si prende in considerazione la concorrenza, tutti questi controlli sono inutili perché in ogni caso qualche altro thread è in grado di creare, cancellare o fare qualsiasi altra cosa con il file. In questo caso è necessario utilizzare i blocchi di file che non consiglierei di fare;)

0

Nel mio caso era solo una mancanza di autorizzazione:

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

Problemi correlati