web-dev-qa-db-fra.com

File.mkdir ou mkdirs renvoient false - Reason?

Pourquoi file.mkdir renvoie false?

Google indique qu'il pourrait y avoir plusieurs raisons (sécurité, autorisations, chemin d'accès, etc.). 

Mes questions:

  1. Comment trouver la raison exacte de retourner faux?
  2. Si la sécurité/autorisations est une raison, alors pourquoi SecurityException n'est pas levé?
33
Sandeep Jindal

Si la sécurité/les autorisations sont une raison, alors pourquoi SecurityException n'est PAS levée (ce qui est mentionné dans javadoc)?

Une SecurityException est lancée lorsque vous ne disposez pas de l'autorisation JVM de faire quelque chose, pas du système d'exploitation.

Existe-t-il un moyen de trouver la raison exacte pour laquelle renvoyer faux?

Non, autant que je sache. La seule façon de le savoir serait de vérifier vous-même les autorisations sur le répertoire, assurez-vous qu'il n'existe pas avant de les appeler, vérifiez si le répertoire parent existe, etc.

Toutefois, si vous utilisez Java 7 ou supérieur, vous pouvez utiliser NIO à la place pour créer le répertoire. Plus précisément, Files.createDirectory :

File dir = new File("mydir");
Files.createDirectory(dir.toPath());

Si vous souhaitez utiliser NIO entièrement avec Java.io.File, vous pouvez utiliser Paths.get pour créer une Path à la place:

Path dir = Paths.get("mydir");
Files.createDirectory(dir);

Dans les deux cas, si le répertoire ne peut pas être créé, il lancera une IOException avec la raison exacte de l'échec de l'opération.

Cela est vrai pour la plupart des méthodes de Files. Il est donc recommandé de l'utiliser plutôt que d'utiliser les méthodes de la classe File.

23
Brian

mkdir et mkdirs renvoient false si le répertoire existe déjà, ce qui pourrait expliquer en partie l'échec.

Si vous utilisez Java 7, vous pouvez utiliser la classe Files. Il lève une exception IOException par erreur avec de très bonnes descriptions.

Files.createDirectory(file.toPath());
43
Michael Krussel
  1. Non, il n'existe aucun moyen de trouver la raison exacte pour que mkdirs() renvoie false, du moins pas à partir de Java, car cela dépendrait probablement du système d'exploitation.

  2. Une SecurityException est renvoyée s'il y a une violation de la sécurité dans les méthodes SecurityManager 's checkRead() et checkWrite(). L'exception n'est pas levée s'il existe un problème d'autorisations de système d'exploitation.


En outre, notez que si vous appelez File.mkdir() et que le répertoire parent n'existe pas, mkdir() renverra false. Cependant, l'appel de File.mkdirs() créera les répertoires parent non existants.

8
Jon Lin

Voici quelque chose de spécifique à Windows: Dans mon cas, la méthode file.mkdir() échouait avec NoSuchFileException car j'essayais de créer directement une structure de répertoire imbriquée (par exemple results\results_ddMMyyyy sans d'abord créer le répertoire results) sous Windows.

Cependant, le même code a parfaitement fonctionné sur mon Mac, c’est-à-dire qu’aucune exception de ce type n’a été générée sur Mac et que le répertoire intermédiaire results a été créé de manière implicite par la méthode file.mkdir()

J'espère que cela aidera quelqu'un à l'avenir.

0
Akshay Maldhure