web-dev-qa-db-fra.com

File.createNewFile () thowing IOException Aucun fichier ou répertoire de ce type

J'ai une méthode qui écrit dans un fichier journal. Si le fichier existe, il doit 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;
}

Je dois vérifier qu'un fichier peut être créé. Le fichier est un objet Java.io.File. createNewFile génère une exception IOException: Aucun fichier ni répertoire de ce type. Cette méthode fonctionne parfaitement depuis que je l’ai écrite il ya quelques semaines et ne l’a commencé que récemment, bien que je ne sache pas ce que j’aurais pu changer. J'ai vérifié, le répertoire existe et j'ai les autorisations d'écriture pour cela, mais j'ai alors pensé qu'il devrait simplement renvoyer 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?

25
A Jackson

normalement, c’est quelque chose que vous avez modifié récemment. Tout d’abord, votre exemple de code est si aucun fichier n’existe et si vous ne créez pas un nouveau fichier - vous essayez de coder quelque chose - de quoi s’agit-il?

Ensuite, examinez une liste de répertoires pour voir si elle existe réellement et effectuez un println/toString () sur l’objet fichier et getMessage () sur l’exception, ainsi que la trace de la pile d’impression.

Ensuite, recommencez à zéro connaissance et réfléchissez dès le départ à chaque étape que vous utilisez pour vous rendre ici. C'est probablement un duh que vous avez coincé quelque part en conceptualisant dans le code (parce que ça fonctionnait) - vous retracez chaque étape en détail, vous la trouverez.

6
Nicholas Jordan

essayez de vous assurer que le répertoire parent existe avec:

file.getParentFile().mkdirs()
92
Omry Yadan

Peut-être que le répertoire dans lequel le fichier est créé n'existe pas?

7

Je pense que l'exception que vous obtenez est probablement le résultat de la vérification du fichier de la méthode atomique file.createNewFile(). La méthode ne peut pas vérifier si le fichier existe car certains des répertoires parents n'existent pas ou vous n'avez pas le droit d'y accéder. Je suggérerais 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 tenez compte de la simultanéité, 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 recommanderais pas de faire;)

3
user172713

Selon les [documents Java] ( http://Java.Sun.com/j2se/1.5.0/docs/api/Java/io/File.html#createNewFile () ) createNewFile créera 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 ne remplacera pas un fichier existant, vous pouvez réécrire votre code comme suit:

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

Cela peut faciliter la détection des problèmes de threading, conditions de course, etc.

3
Glen

Vous obtenez certainement cette exception'Le système ne trouve pas le chemin spécifié'

Imprimez simplement 'file.getAbsoluteFile ()', cela vous permettra de savoir quel est le fichier que vous voulez créer. 

Cette exception se produira si le répertoire dans lequel vous créez le fichier n'existe pas .

2
Rakesh Juyal

Dans mon cas, c'était juste un manque de permission:

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

0
karenms

Cela pourrait être un problème de threading (vérifier et créer ensemble ne sont pas atomiques: !file.exists() && !file.createNewFile()) ou le "fichier" est déjà un répertoire .

Essayez (file.isFile()):

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