Java File.renameTo()
ist problematisch, besonders unter Windows, wie es scheint. Wie in der API-Dokumentation angegeben ,
Viele Aspekte des Verhaltens dieser Methode sind von Natur aus plattformabhängig: Der Umbenennungsvorgang kann eine Datei möglicherweise nicht von einem Dateisystem in ein anderes verschieben, ist möglicherweise nicht atomar und erfolgreich, wenn eine Datei mit dem abstrakten Zielpfadnamen erstellt wird ist bereits vorhanden. Der Rückgabewert sollte immer überprüft werden, um sicherzustellen, dass der Umbenennungsvorgang erfolgreich war.
In meinem Fall muss ich im Rahmen eines Upgrade-Vorgangs ein Verzeichnis verschieben (umbenennen), das möglicherweise Gigabyte an Daten enthält (viele Unterverzeichnisse und Dateien unterschiedlicher Größe). Das Verschieben erfolgt immer innerhalb derselben Partition / Laufwerk, sodass nicht wirklich alle Dateien auf der Festplatte physisch verschoben werden müssen.
Es sollten keine Dateisperren für den Inhalt des zu verschiebenden Verzeichnisses vorhanden sein, aber dennoch erledigt renameTo () häufig seine Aufgabe nicht und gibt false zurück. (Ich vermute nur, dass einige Dateisperren unter Windows möglicherweise etwas willkürlich ablaufen.)
Derzeit habe ich eine Fallback-Methode, die das Kopieren und Löschen verwendet, aber das ist zum Kotzen, da es je nach Größe des Ordners viel Zeit in Anspruch nehmen kann. Ich denke auch darüber nach, einfach die Tatsache zu dokumentieren, dass der Benutzer den Ordner manuell verschieben kann, um möglicherweise stundenlanges Warten zu vermeiden. Aber der richtige Weg wäre offensichtlich etwas Automatisches und Schnelles.
Meine Frage ist also, ob Sie einen alternativen, zuverlässigen Ansatz kennen, um mit Java unter Windows schnell zu verschieben / umzubenennen , entweder mit einfachem JDK oder einer externen Bibliothek. Oder wenn Sie eine einfache Möglichkeit kennen, Dateisperren für einen bestimmten Ordner und den gesamten Inhalt (möglicherweise Tausende einzelner Dateien) zu erkennen und aufzuheben , ist dies ebenfalls in Ordnung.
Bearbeiten : In diesem speziellen Fall scheinen wir davongekommen zu sein, indem wir nur renameTo()
ein paar weitere Dinge berücksichtigt haben. siehe diese Antwort .