2009-08-25 11 views
27

J'utilise WinXP. J'utilise Java pour générer une liste de fichiers. Le fichier sera créé comme abc.txt.temp au début, et après avoir terminé la génération, il sera renommé en abc.txt. Toutefois, lors de la génération des fichiers, certains fichiers n'ont pas pu être renommés. Cela arrive au hasard.Comment savoir pourquoi renameTo() a échoué?

Y at-il de toute façon pour trouver la raison pour laquelle il a échoué?

int maxRetries = 60; 
logger.debug("retry"); 
while (maxRetries-- > 0) 
{ 
    if (isSuccess = file.renameTo(file2)) 
    { 
     break; 
    } 
    try 
    { 
     logger.debug("retry " + maxRetries); 
     Thread.sleep(1000); 
    } 
    catch (InterruptedException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

//file.renameTo(file2); 
Thread.currentThread().getThreadGroup().getParent().list(); 

Et le résultat:

[DEBUG][2009-08-25 08:57:52,386] - retry 1 
[DEBUG][2009-08-25 08:57:53,386] - retry 0 
java.lang.ThreadGroup[name=system,maxpri=10] 
    Thread[Reference Handler,10,system] 
    Thread[Finalizer,8,system] 
    Thread[Signal Dispatcher,9,system] 
    Thread[Attach Listener,5,system] 
    java.lang.ThreadGroup[name=main,maxpri=10] 
     Thread[main,5,main] 
     Thread[log4j mail appender,5,main] 
[DEBUG][2009-08-25 08:57:54,386] - isSuccess:false 

Je voudrais savoir une approche systématique pour comprendre la raison. Merci.

+0

Attrapez-vous des exceptions lancées? – seth

+0

no. aucune exception du tout. Cela ne renvoie que faux. – janetsmith

+0

J'ai mis à jour ma réponse. –

Répondre

24

Il est possible que la raison du changement de nom soit l'ouverture du fichier. Même si vous fermez le fichier, il pourrait être maintenu ouvert à cause de (par exemple):

  1. Un descripteur de fichier est héritée par un sous-processus de votre processus
  2. Un programme anti-virus scanne le fichier pour virus, et a donc ouvert
  3. Un indexeur (tel que Google Desktop ou le service d'indexation de Windows) a ouvert le fichier

Pour vous aider à trouver ce qui est de garder le fichier ouvert, d'utiliser des outils tels que FileMon et Handle.

Mise à jour: Un outil tel que Unlocker peut ne pas aider, si le fichier n'est ouvert que très brièvement (comme ce serait le cas pour un scan anti-virus). Cependant, si javaw.exe est montré comme ayant le fichier ouvert, c'est votre problème ici.

+0

J'utilise Unlocker. et il montre seulement "javaw.exe" comme seul casier. :( – janetsmith

+0

Je pense que les applications de numérisation comme les anti-virus et les indexeurs ne devraient pas pouvoir contenir le fichier et l'empêcher d'être altéré ou renommé ... Est-ce vraiment le cas dans WinXP? – Yuval

+0

Ils ne tiennent pas le Si vous écrivez dans un fichier, fermez-le et essayez de le renommer, le fichier * pourrait toujours être ouvert à ce moment-là (mais pas –

2

Si aucune exception n'a été levée (je suppose que vous l'auriez remarqué) renameTo() renvoie uniquement la valeur true ou false pour indiquer si le renommage a réussi ou non et ne fournit aucune information supplémentaire.

Puisqu'il s'agit de Windows, un échec indique très probablement que le fichier est actuellement utilisé. Cela arriverait parce qu'un autre processus l'a ouvert. Plus probablement cependant, votre processus n'a pas fini de l'écrire ou vous avez oublié de fermer le fichier après que vous ayez fini de l'écrire.

Il est également possible que vous ayez passé un chemin invalide, ou le chemin a donné un chemin inexistant au constructeur File.

renameTo() ne lèvera des exceptions que s'il y a une violation de sécurité (SecurityException) ou si vous transmettez un null pour le fichier à renommer.

+1

Je sais que ça retourne faux, mais ça ne donne aucune idée de pourquoi il a échoué. J'ai fermé tous les outputStream.close() et le mettre à null. Mais il a toujours échoué au hasard. Disons que j'ai généré 10 fichiers, file0.tmp ... file9.tmp, il se peut que file5.tmp ne soit pas passé à file5.txt. – janetsmith

1

J'ai eu un problème similaire, mais c'est avec unix.
Le changement de nom a échoué de manière aléatoire. J'ai redémarré le processus 3 à 4 fois et finalement je suis allé au succès.
FYI le fichier a été créé par le même processus et le même processus le renomme ..

-4

Fichier f = nouveau Fichier (dossier + fichier); vérifiez avec si vous avez écrit le chemin correct .. f.exists(); else existe et renvoie false vérifier avec procMon si est regardé ..

2
File o=new File("d:/old.txt"); 
File n=new File("d:/new.txt"); 
n.delete(); 
o.renameTo(n); 

n.delete(): Nous devons supprimer le fichier (new.txt) si elle existe.

o.rename(n): pour que le fichier (old.txt) est renommé new.txt

+2

J'ai fait exactement cela et j'ai encore obtenu un faux retour de renommer Le fichier était fermé et rien d'autre ne l'avait ... Windows ... Juste ... Windows – stu

3

Trois raisons majeures renameTo peut échouer (pour Android, mais vous pouvez également trouver ce utile)!

1) Si vous déplacez des dossiers de l'endroit a à l'endroit b, le dossier de destination peut être un fichier! Faites le fichier destinationFolder.mkdirs() pour en faire un fichier!

2) Le dossier de destination peut déjà exister! Supprimez le dossier de destination afin de pouvoir renommer l'ancien fichier

3) Déplacer le stockage interne vers un stockage externe nécessite une autorisation, car la lecture et l'écriture sur la carte SD nécessitent une autorisation!

+0

J'ai trouvé cette question via Google, et # 2 était mon problème "Merci pour l'aide! –

+1

" Faire le dossier de destination.mkdirs() pour en faire un fichier! "Huh? – EntangledLoops

Questions connexes