Fichier.createNewFile() thowing IOException aucun fichier ou répertoire
J'ai une méthode qui écrit dans un fichier journal. Si le fichier existe, il devrait y être ajouté, sinon je veux qu'il crée un nouveau fichier.
if (!file.exists() && !file.createNewFile()) {
System.err.println("Error with output file: " + outFile
+ "nCannot create new file.");
continue;
}
J'ai cela pour vérifier qu'un fichier peut être créé. fichier est un objet java.Io.File. createNewFile lance une exception IOException: aucun fichier ou répertoire de ce type. Cette méthode fonctionne parfaitement depuis que je l'ai écrit il y a quelques semaines et n'a commencé que récemment à le faire bien que je ne sache pas ce que j'aurais pu changer. J'ai vérifié, le répertoire existe et j'ai des autorisations d'écriture pour cela, mais alors j'ai pensé qu'il devrait simplement retourner false s'il ne peut pas créer le fichier pour une raison quelconque.
Y a-t-il quelque chose qui me manque pour que cela fonctionne?
8 réponses
Normalement, c'est quelque chose que vous avez changé récemment, tout d'abord votre exemple de code est si le fichier n'existe pas et ne crée pas de nouveau fichier - vous essayez de coder quelque chose - qu'est-ce que c'est?
Ensuite, regardez une liste de répertoires pour voir si elle existe réellement et faites un println / toString () sur l'objet file et getMessage () sur l'exception, ainsi que la trace de la pile d'impression.
Ensuite, commencez à partir de zéro connaissance à nouveau et re facteur de la get-go chaque étape que vous utilisez pour arriver ici. C'est probablement un duh que vous avez coincé là quelque part en conceptualisant dans le code ( parce que cela fonctionnait ) - vous venez de retracer chaque étape en détail, vous le trouverez.
Essayez de vous assurer que le répertoire parent existe avec:
file.getParentFile().mkdirs()
Peut-être que le répertoire dans lequel le fichier est créé n'existe pas?
Selon les [documents java] ( http://java.sun.com/j2se/1.5.0/docs/api/java/io/File.html#createNewFile() ) createNewFile
va créer un nouveau fichier atomiquement pour vous.
Atomically creates a new, empty file named by this abstract pathname if and only if a file with this name does not yet exist.
Étant donné que createNewFile
est atomique et n'écrira pas un fichier existant, vous pouvez réécrire votre code comme
try {
if(!file.createNewFile()) {
System.out.println("File already exists");
}
} catch (IOException ex) {
System.out.println(ex);
}
Cela peut rendre les problèmes de threading potentiels, les conditions de course, etc., plus faciles à repérer.
Je pense que l'exception que vous obtenez est probablement le résultat de la vérification des fichiers de la atomique méthode file.createNewFile()
. La méthode ne peut pas vérifier si le fichier existe car certains des répertoires parents n'existent pas ou si vous n'avez pas les autorisations d'y accéder. Je suggère ceci:
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
}
Si vous prenez en compte la concurrence, toutes ces vérifications sont inutiles car dans tous les cas un autre thread est capable de créer, de supprimer ou de faire autre chose avec votre fichier. Dans ce cas vous devez utiliser des verrous de fichiers ce que je ne suggérerais pas de faire ;)
Vous obtenez certainement cette Exception 'Le système ne peut pas trouver le chemin d'accès spécifié'
Il suffit d'imprimer le fichier.getAbsoluteFile ()', cela vous permettra de savoir quel est le fichier que vous souhaitez créer.
Cette exception se produit si le Répertoire dans lequel vous créez le fichier n'existe pas.
, Cela pourrait être une problème thread (vérification et de créer ensemble ne sont pas atomiques: !file.exists() && !file.createNewFile()
) ou le "fichier" est déjà un répertoire.
Essayer (file.isFile()
) :
if (file.exists() && !file.isFile()){
//handle directory is there
}else if(!file.createNewFile()) {
//as before
}
Dans mon cas était juste un manque d'autorisation:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />