Java kann eine Datei nicht verschieben (umbenennen), wenn sich die resultierende Datei in einem anderen Dateisystem befindet

7

Ein Programm, das wir falsch gemacht haben, als wir versuchten, Dateien von einem Verzeichnis in ein anderes zu verschieben. Nach vielem Debugging habe ich den Fehler gefunden, indem ich ein kleines Dienstprogramm geschrieben habe, das nur eine Datei von einem Verzeichnis in ein anderes verschiebt (Code unten). Es stellt sich heraus, dass das Verschieben von Dateien im lokalen Dateisystem zwar funktioniert, aber der Versuch, eine Datei in ein anderes Dateisystem zu verschieben, schlägt fehl.

Warum ist das? Die Frage könnte plattformspezifisch sein - wir betreiben Linux auf ext3, wenn das wichtig ist.

Und die zweite Frage; Sollte ich etwas anderes als die Methode renameTo() der Klasse File verwendet haben? Es scheint, als ob dies nur auf lokalen Dateisystemen funktioniert.

Tests (laufen als root):

%Vor%

Code:

%Vor%     
oligofren 10.05.2012, 09:59
quelle

4 Antworten

16

Aus den Dokumenten von File.renameTo :

  

[...] Der Umbenennungsvorgang ist möglicherweise nicht in der Lage, eine Datei von einem Dateisystem in ein anderes zu verschieben [...]

Die offensichtliche Problemumgehung wäre, die Datei "manuell" zu kopieren, indem Sie eine neue Datei öffnen, den Inhalt in die Datei schreiben und die alte Datei löschen.

Sie können auch die % co_de ausprobieren % Methode von Apache Commons.

    
aioobe 10.05.2012, 10:01
quelle
6

Javadoc zur Rettung:

  

Viele Aspekte des Verhaltens dieser Methode sind inhärent   plattformabhängig: Der Umbenennungsvorgang ist möglicherweise nicht in der Lage, a zu verschieben   Datei von einem Dateisystem zum anderen, es könnte nicht atomar sein, und es   möglicherweise nicht erfolgreich, wenn eine Datei mit dem abstrakten Pfadnamen des Ziels vorhanden ist   ist bereits vorhanden. Der Rückgabewert sollte immer überprüft werden, um sicherzustellen   dass der Umbenennungsvorgang erfolgreich war.

     

Beachten Sie, dass die Files-Klasse die move-Methode zum Verschieben oder Umbenennen von a definiert   Datei in einer plattformunabhängigen Art und Weise.

    
JB Nizet 10.05.2012 10:02
quelle
1

Aus der Dokumentation:

  

Benennt die Datei um, die mit diesem abstrakten Pfadnamen gekennzeichnet ist.

     

Viele Aspekte des Verhaltens dieser Methode sind inhärent   plattformabhängig: Der Umbenennungsvorgang ist möglicherweise nicht in der Lage, a zu verschieben   Datei von einem Dateisystem zum anderen, es könnte nicht atomar sein, und es   möglicherweise nicht erfolgreich, wenn eine Datei mit dem abstrakten Pfadnamen des Ziels vorhanden ist   ist bereits vorhanden. Der Rückgabewert sollte immer überprüft werden, um sicherzustellen   dass der Umbenennungsvorgang erfolgreich war.

Wenn Sie Dateien zwischen verschiedenen Dateisystemen verschieben möchten, können Sie Apache verwenden: moveFile

    
mprabhat 10.05.2012 10:08
quelle
-1

Ihr Name ist ein Fehler Beause / some_other_disk / ist relative URL, aber vollständig URL, kann die URL nicht finden Ich habe Beispiel

java FileMover D: \ Eclipse33_workspace_j2ee \ test \ src \ a \ a.txt D: \ Eclipse33_workspace_j2ee \ test \ src Die Dateiverschiebung war erfolgreich.

java FileMover D: \ Eclipse33_workspace_j2ee \ test \ src \ a \ a.txt \ Eclipse33_workspace_j2ee \ test \ src

Die Dateiverschiebung war fehlerhaft.

Ergebnis ist URL ist Fehler

    
david.zhang 10.05.2012 10:27
quelle

Tags und Links