J'utilise WinXP. J'utilise Java pour générer une liste de fichiers. Le fichier sera d'abord créé sous le nom abc.txt.temp, puis une fois la génération terminée, il sera renommé abc.txt.
Cependant, lors de la génération des fichiers, certains fichiers n’ont pas été renommés. Cela arrive au hasard.
Est-il possible de trouver la raison pour laquelle cela 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 connaître une approche systématique pour comprendre la raison. Merci.
Il est possible que le renommage ait échoué parce que le fichier est toujours ouvert. Même si vous fermez le fichier, il peut rester ouvert à cause de (par exemple):
Pour vous aider à déterminer ce qui maintient le fichier ouvert, utilisez des outils tels que FileMon et Handle .
Mise à jour: Un outil tel que Unlocker peut ne pas aider, si le fichier n'est maintenu ouvert que pendant une très courte période (comme dans le cas d'une analyse antivirus). Cependant, si javaw.exe est montré comme ayant le fichier ouvert, c'est votre problème.
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) s'il existe.
o.rename(n)
: afin que le fichier (old.txt) soit renommé new.txt
Trois raisons majeures pour renommerTo peuvent échouer (pour Android, mais vous pouvez également trouver cela utile)!
1) Si vous déplacez des dossiers d’un endroit à un autre, le dossier de destination peut être un fichier! Faites le destinationFolder.mkdirs () pour en faire un fichier!
2) Le dossier de destination existe peut-être déjà! Supprimez le dossier destination afin de pouvoir utiliser renameTo pour déplacer l'ancien fichier vers ce nouvel emplacement.
3) Le déplacement de la mémoire interne vers la mémoire externe nécessite une autorisation, car la lecture et l'écriture sur une carte SD doivent être autorisées!
Si aucune exception n'a été levée (je suppose que vous auriez remarqué cela), renameTo()
renvoie uniquement true ou false pour indiquer si le changement de nom a abouti ou non et ne fournit aucune information supplémentaire.
Comme il s'agit de Windows, une défaillance indique probablement que le fichier est en cours d'utilisation. Cela se produirait parce qu'un autre processus l'a ouvert. Il est plus probable que votre processus ne soit pas terminé ou que vous ayez oublié de fermer le fichier après l'avoir écrit.
Il est également possible que vous ayez indiqué un chemin non valide ou un chemin inexistant vers le constructeur File
.
renameTo()
lève des exceptions uniquement en cas de violation de la sécurité (SecurityException
) ou si vous transmettez une null
pour le fichier à renommer.
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 relancé le processus 3 à 4 fois et suis finalement allé au succès.
FYI le fichier a été créé par le même processus et le même processus le renomme ..
Il est également possible que vous ne puissiez pas renommer le fichier car vous ne disposez pas des autorisations suffisantes. Sous Unix, c'est simple. Sur Win10, eh bien ... voir par exemple https://www.sevenforums.com/tutorials/1911-take-ownership-shortcut.html