Java File.renameTo()
est problématique, surtout sous Windows, semble-t-il. Comme le Documentation de l'API dit,
De nombreux aspects du comportement de cette méthode sont intrinsèquement dépendent de la plate-forme : L'opération renommer peut ne pas être en mesure de déplacer un fichier d'un système de fichiers à un autre, elle pourrait ne pas être atomique, et elle pourrait ne pas réussir si un fichier avec le chemin d'accès abstrait de destination existe déjà existe déjà. La valeur de retour doit toujours être être vérifiée pour s'assurer que l'opération de l'opération de renommage a réussi.
Dans mon cas, dans le cadre d'une procédure de mise à jour, je dois déplacer (renommer) un répertoire qui peut contenir des gigaoctets de données (beaucoup de sous-répertoires et de fichiers de tailles différentes). Le déplacement se fait toujours au sein de la même partition/du même disque, il n'est donc pas nécessaire de déplacer physiquement tous les fichiers sur le disque.
Il y a ne devrait pas être n'importe quel verrou de fichier au contenu du répertoire à déplacer, mais quand même, assez souvent, renameTo() échoue à faire son travail et retourne false. (Je suppose simplement que peut-être certains verrous de fichiers expirent de manière quelque peu arbitraire sous Windows).
Actuellement, j'ai une méthode de secours qui utilise la copie et la suppression, mais c'est nul parce que cela peut prendre beaucoup de temps, en fonction de la taille du dossier. J'envisage également de documenter simplement le fait que l'utilisateur peut déplacer le dossier manuellement pour éviter d'attendre pendant des heures, potentiellement. Mais la bonne méthode serait évidemment quelque chose d'automatique et de rapide.
Donc ma question est, Connaissez-vous une approche alternative et fiable pour effectuer un déplacement/renommage rapide avec Java sous Windows ? soit avec le simple JDK ou une bibliothèque externe. Ou si vous connaissez un facile moyen de détecter et de lever tout verrouillage de fichier pour un dossier donné et tout son contenu (éventuellement des milliers de fichiers individuels), cela conviendrait également.
Editar : Dans ce cas particulier, il semble que nous nous en soyons sortis en utilisant juste renameTo()
en tenant compte de quelques éléments supplémentaires ; voir cette réponse .
3 votes
Vous pouvez attendre/utiliser le JDK 7, qui prend bien mieux en charge les systèmes de fichiers.
0 votes
@kd304, en fait je ne peux pas attendre ou utiliser une version en accès anticipé, mais c'est intéressant de savoir que quelque chose comme ça est en route !