Zuverlässige File.renameTo () Alternative unter Windows?
Java'sFile.renameTo()
ist problematisch, vor allem unter Windows, wie es scheint. Als dieAPI-Dokumentation sagt,
Viele Aspekte des Verhaltens dieser Methode hängen von der jeweiligen Plattform ab: Der Umbenennungsvorgang ist möglicherweise nicht in der Lage, eine Datei von einem Dateisystem in ein anderes zu verschieben, ist möglicherweise nicht atomar und schlägt möglicherweise fehl, wenn eine Datei den abstrakten Pfadnamen des Ziels enthält 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 Upgrades ein Verzeichnis verschieben (umbenennen), das möglicherweise Gigabyte an Daten enthält (viele Unterverzeichnisse und Dateien unterschiedlicher Größe). Das Verschieben erfolgt immer auf derselben Partition / demselben Laufwerk, sodass nicht alle Dateien auf der Festplatte physisch verschoben werden müssen.
Dortsollte nicht Sei es eine Dateisperre für den Inhalt des zu verschiebenden Verzeichnisses, aber dennoch erledigt renameTo () nicht immer seine Aufgabe und gibt false zurück. (Ich vermute nur, dass einige Dateisperren unter Windows möglicherweise willkürlich ablaufen.)
Derzeit habe ich eine Fallback-Methode, die das Kopieren und Löschen verwendet, aber das ist zum Kotzen, weil es dauern kannviel Zeit, abhängig von der Größe des Ordners. Ich denke auch darüber nach, einfach 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.
Also meine Frage ist,Kennen Sie einen alternativen, zuverlässigen Ansatz für eine schnelle Verschiebung / Umbenennung mit Java unter Windows?, entweder mit normalem JDK oder einer externen Bibliothek. Oder wenn Sie einen kenneneinfach Möglichkeit zum Erkennen und Freigeben von Dateisperren für einen bestimmten Ordner undDer gesamte Inhalt (möglicherweise Tausende einzelner Dateien), das wäre auch in Ordnung.
Bearbeiten: In diesem speziellen Fall scheint es, dass wir mit nur durchgekommen sindrenameTo()
indem wir noch ein paar Dinge berücksichtigen; sehendiese Antwort.