Comment créer un nouveau fichier avec des répertoires parents manquants?

98

Lors de l'utilisation

file.createNewFile();

J'obtiens l'exception suivante

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

Je me demande s'il existe un createNewFile qui crée les répertoires parents manquants?

Pentium10
la source

Réponses:

150

Avez-vous essayé cela?

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

Je ne connais pas un seul appel de méthode qui fera cela, mais c'est assez simple comme deux déclarations.

Jon Skeet
la source
Cela ne fonctionne que si le fichier a été créé avec une chaîne de chemin contenant un répertoire parent, c'est-à-dire new File("file.txt").getParentFile()renvoie null, new File("dir/file.txt").getParentFile()renvoie le même quenew File("dir")
Zoltán
1
Certes, vous n'avez pas besoin mkdirssi le fichier que vous essayez de créer ne se trouve pas dans un répertoire inexistant, mais mon cas d'utilisation est que je crée plusieurs fichiers, dont certains ont des répertoires parents, tandis que d'autres ne le font pas.
Zoltán
14

La réponse de Jon fonctionne si vous êtes certain que la chaîne de chemin avec laquelle vous créez un fichier inclut les répertoires parents, c'est-à-dire si vous êtes certain que le chemin est de la forme <parent-dir>/<file-name>.

Si ce n'est pas le cas, c'est-à-dire qu'il s'agit d'un chemin relatif du formulaire <file-name>, alors getParentFile()retournera null.

Par exemple

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`.

Donc, si votre chemin de fichier peut ou non inclure des répertoires parents, vous êtes plus sûr avec le code suivant:

File f = new File(filename);
if (f.getParentFile() != null) {
  f.getParentFile().mkdirs();
}
f.createNewFile();
Zoltán
la source
pour de nombreuses raisons, vous devez toujours inclure un chemin. Sinon, comment le système devrait-il savoir où vous souhaitez placer ce fichier?
NikkyD
@NikkyD Je suis désolé, je ne comprends pas très bien votre commentaire. Dans ma réponse, je ne dis pas que vous n'incluez pas de chemin, mais que le chemin passé peut ne pas inclure les répertoires parents . Il y a aussi un exemple d'un tel chemin dans la réponse.
Zoltán
7

À partir de java7, vous pouvez également utiliser l'API NIO2:

void createFile() throws IOException {
    Path fp = Paths.get("dir1/dir2/newfile.txt");
    Files.createDirectories(fp.getParent());
    Files.createFile(fp);
}
Ted
la source