2009-10-06 4 views
18

J'ai une méthode qui écrit dans un fichier journal. Si le fichier existe, il doit s'y ajouter, sinon je veux qu'il crée un nouveau fichier. J'ai besoin de vérifier qu'un fichier peut être créé. le fichier est un objet java.io.File. createNewFile lance une exception d'E/S: aucun fichier ou répertoire de ce type. Cette méthode fonctionne parfaitement depuis que je l'ai écrite il y a quelques semaines et je ne fais que commencer à le faire depuis peu, bien que je ne sache pas ce que j'aurais pu changer. J'ai vérifié, le répertoire existe et j'ai des permissions d'écriture pour cela, mais alors j'ai pensé qu'il devrait renvoyer juste faux s'il ne peut pas faire le dossier pour n'importe quelle raison.File.createNewFile() Thow IOException Aucun fichier ou répertoire de ce type

Y at-il quelque chose qui me manque pour que cela fonctionne?

+0

Est-ce que le IOException contient un message ou toute autre chose qui pourrait soit utile? – Glen

+1

Peut-être vieux, mais vous obtiendrez la même erreur si vous n'avez pas les autorisations d'écrire à l'endroit où vous voulez écrire. '' le répare. –

Répondre

6

normalement c'est quelque chose que vous avez changé récemment, d'abord votre code d'échantillon est si le fichier n'existe et ne pas créer de nouveaux fichiers - vous essayez de coder loin 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 fichier et getMessage() sur l'exception, ainsi que trace de la pile d'impression.

Puis, recommencez à partir de zéro connaissance et ré-factoriser dès le départ 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 ça fonctionnait) - vous venez de retracer chaque étape en détail, vous le trouverez.

+0

Merci. J'ai passé un peu de temps à parcourir tout et trouvé où il lit le chemin à partir d'un fichier cfg il ne supprimait pas deux points. output_file: path Quand il fonctionnait pour la dernière fois, je n'avais pas encore fait le fichier cfg, c'était un chemin codé en dur. –

+0

@Android: Juste curieux: Est-ce différent de ce que j'ai recommandé dans http://stackoverflow.com/questions/1525060/file-createnewfile-thowing-ioexception-no-such-file-or-directory/1525073#1525073? –

+0

@Hemal Pandya - J'ai vu votre commentaire, et comme il est indiqué, il est correct - Je viens de traverser tant de fois que je pensais que je pourrais mieux le mot pour l'affiche. @Android - souvenez-vous bien de cette leçon, laissez-la constamment être avec vous. Les opérations de classe mondiale ont été complètement bousculées par ce nombre suffisant de fois que la récupération soigneusement conçue est une compétence centrale super critique, qui vient seulement avec ce type de travail de récupération. Utilisez un type d'archive Feed-Forward, avec des lecteurs de cartes disponibles à portée de main, il n'y a aucune raison de perdre des pistes récupérables. –

6

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

+0

Cela devrait être la réponse acceptée à mon avis. –

+0

@ JorgeAntonioDíaz-Benito J'imagine que l'upvote vient de vous? Merci pour ça. –

0

Cela pourrait être un problème de filetage (vérification et la création d'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

Avez-vous lu les JavaDocs pour createNewFile? Vérifier et créer est en effet une opération atomique et donc sans danger pour les threads. – jarnbjo

+2

file.exist() est atomique et file.createNewFile est atomique. Mais entre ces deux appels, des changements simultanés peuvent se produire. –

+0

jetez un oeil à cette réponse: http://stackoverflow.com/questions/1525060/file-createnewfile-thowing-ioexception-no-such-file-or-directory/1525132#1525132 –

3

Selon les [docs java] (http://java.sun.com/j2se/1.5.0/docs/api/java/io/File.html#createNewFile()) createNewFile va créer un nouveau fichier de 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 sera écrasez 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 faire des problèmes de filetage potentiels, course-conditions , etc, plus facile à repérer.

73

essayer d'assurer le répertoire parent existe avec:

file.getParentFile().mkdirs() 
2

vous êtes certainement obtenir cette exception « Le système ne peut pas trouver le chemin spécifié »

Juste print « file.getAbsoluteFile() », cela vous permettra de savoir quel est le fichier que vous vouliez créer.

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

+0

Est-ce différent de ma réponse? –

+0

non, obviuosly pas :) –

3

Je pense que l'exception que vous obtenez est probablement le résultat de la vérification de 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 aucune autorisation pour 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, tous ces contrôles sont inutiles parce que dans tous les cas, un autre thread est en mesure de créer, supprimer ou faire autre chose avec votre fichier. Dans ce cas, vous devez utiliser les verrous de fichier que je ne conseille de faire;)

0

Dans mon cas était juste un manque d'autorisation:

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

Questions connexes