Come creare un nuovo file insieme alle directory principali mancanti?


98

Quando si usa

file.createNewFile();

Ottengo la seguente eccezione

java.io.IOException: Parent directory of file does not exist: /.../pkg/databases/mydb

Mi chiedo se esiste un createNewFile che crea le directory padre mancanti?

Risposte:


150

Hai provato questo?

file.getParentFile().mkdirs();
file.createNewFile();

Non conosco una singola chiamata al metodo che lo farà, ma è abbastanza semplice come due istruzioni.


Funziona solo se il file è stato creato con una stringa di percorso che contiene una directory principale, ovvero new File("file.txt").getParentFile()restituisce null, new File("dir/file.txt").getParentFile()restituisce lo stesso dinew File("dir")
Zoltán

1
È vero, non è necessario mkdirsse il file che si sta tentando di creare non si trova in una directory inesistente, ma il mio caso d'uso è che sto creando più file, alcuni dei quali hanno directory principali, mentre altri no.
Zoltán

14

La risposta di Jon funziona se si è certi che la stringa del percorso con cui si sta creando un file includa le directory principali, ovvero se si è certi che il percorso sia della forma <parent-dir>/<file-name>.

In caso contrario, ovvero è un percorso relativo del modulo <file-name>, getParentFile()verrà restituito null.

Per esempio

File f = new File("dir/text.txt");
f.getParentFile().mkdirs();     // works fine because the path includes a parent directory.

File f = new File("text.txt");
f.getParentFile().mkdirs();     // throws NullPointerException because the parent file is unknown, i.e. `null`.

Quindi, se il percorso del tuo file può includere o meno le directory principali, sei più sicuro con il seguente codice:

File f = new File(filename);
if (f.getParentFile() != null) {
  f.getParentFile().mkdirs();
}
f.createNewFile();

per molte ragioni dovresti sempre includere un percorso. In quale altro modo il sistema dovrebbe sapere dove vuoi mettere quel file?
NikkyD

@NikkyD mi dispiace, non capisco bene il tuo commento. Nella mia risposta, non sto dicendo che non stai includendo un percorso, ma che il percorso passato potrebbe non includere le directory principali . C'è anche un esempio per un tale percorso nella risposta.
Zoltán,

7

A partire da java7, puoi anche utilizzare l'API NIO2:

void createFile() throws IOException {
    Path fp = Paths.get("dir1/dir2/newfile.txt");
    Files.createDirectories(fp.getParent());
    Files.createFile(fp);
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.