Java File.renameTo()
est problématique, en particulier sous Windows, semble-t-il. Comme le dit la documentation de l' API ,
De nombreux aspects du comportement de cette méthode sont intrinsèquement dépendants de la plate-forme: l'opération de changement de nom peut ne pas être en mesure de déplacer un fichier d'un système de fichiers à un autre, elle peut ne pas être atomique et elle peut échouer si un fichier avec le chemin abstrait de destination existe déjà. La valeur de retour doit toujours être vérifiée pour s'assurer que l'opération de changement de nom a réussi.
Dans mon cas, dans le cadre d'une procédure de mise à niveau, j'ai besoin de déplacer (renommer) un répertoire qui peut contenir des gigaoctets de données (beaucoup de sous-répertoires et de fichiers de différentes tailles). Le déplacement est toujours effectué dans la même partition / lecteur, il n'est donc pas vraiment nécessaire de déplacer physiquement tous les fichiers sur le disque.
Il ne devrait y avoir aucun verrou de fichier sur le contenu du répertoire à déplacer, mais encore, assez souvent, renameTo () échoue à faire son travail et retourne false. (Je suppose juste que certains verrous de fichiers expirent peut-être de manière quelque peu arbitraire sous Windows.)
Actuellement, j'ai une méthode de secours qui utilise la copie et la suppression, mais cela craint car cela peut prendre beaucoup de temps, en fonction de la taille du dossier. J'envisage également de simplement documenter le fait que l'utilisateur peut déplacer le dossier manuellement pour éviter d'attendre des heures, potentiellement. Mais la bonne voie serait évidemment quelque chose d'automatique et rapide.
Ma question est donc la suivante: connaissez-vous une approche alternative et fiable pour effectuer un déplacement / renommer rapide avec Java sur Windows , soit avec le JDK ordinaire ou une bibliothèque externe. Ou si vous connaissez un moyen simple de détecter et de libérer les verrous de fichiers pour un dossier donné et tout son contenu (éventuellement des milliers de fichiers individuels), ce serait bien aussi.
Edit : Dans ce cas particulier, il semble que nous nous en sommes sortis renameTo()
en prenant simplement en compte quelques éléments supplémentaires; voir cette réponse .