2012-05-10 4 views
7

Ein Programm, das beim Versuch, Dateien von einem Verzeichnis in ein anderes zu verschieben, fehlerhaft ist. 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.Java schlägt beim Verschieben (Umbenennen) einer Datei fehl, wenn sich die resultierende Datei in einem anderen Dateisystem befindet.

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 renameTo() Methode der File Klasse verwendet haben? Es scheint, als ob dies nur auf lokalen Dateisystemen funktioniert.

Tests (als root ausführen):

touch /tmp/test/afile 

java FileMover /tmp/test/afile /root/ 
The file move was successful 

touch /tmp/test/afile 

java FileMover /tmp/test/afile /some_other_disk/ 
The file move was erroneous 

Code:

import java.io.File; 

public class FileMover { 
    public static void main(String arguments[]) throws Exception { 
     boolean success; 
     File file = new File(arguments[0]); 
     File destinationDir = new File(arguments[1]); 
     File destinationFile = new File(destinationDir,file.getName()); 
     success = file.renameTo(destinationFile); 
     System.out.println("The file move was " + (success?"successful":"erroneous")); 
    } 
} 

Antwort

16

Aus der Dokumentation von File.renameTo:

[...] Die Operation Umbenennungs könnte nicht in der Lage sein, 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önnten auch die FileUtils.moveFile Methode von Apache Commons versuchen.

+0

Errr ... didnt Ihre Antwort während laden Ich komponiere meins :), moveFile ist der Retter +1 – mprabhat

+0

Ihr Vorschlag auf Apache Commons war genau mein nächster Schritt. Danke für eine informative Antwort, die tatsächlich beide Fragen beantwortet! – oligofren

+1

Um zu der bereits oben bereitgestellten ausgezeichneten Antwort hinzuzufügen, gibt der beim Umbenennen verwendete Systemaufruf EXDEV zurück, wenn oldpath und newpath nicht auf demselben angehängten Dateisystem sind. Tatsächlich behandelt ein Programm wie "mv" diese Situation, indem es eine explizite Kopie ausführt, gefolgt von einer Löschoperation. – ghostkadost

6

Javadoc zur Rettung:

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

Beachten Sie, dass die Klasse Files die Verschiebungsmethode zum Verschieben oder Umbenennen einer Datei in einer plattformunabhängigen Weise definiert.

1

Aus der Dokumentation:

Benennt die Datei mit diesem abstrakten Pfadnamen bezeichnet.

Viele Aspekte des Verhaltens dieser Methode sind von Natur aus plattformabhängig: Der Umbenennungsvorgang nicht in der Lage sein könnte, eine Datei von einem Dateisystem zum anderen zu bewegen, ist es nicht atomar sein könnte, und es möglicherweise nicht erfolgreich sein, wenn Eine Datei mit dem Zielzusammenfassungs-Pfadnamen existiert bereits. Der Rückgabewert sollte immer überprüft werden, um sicherzustellen, dass der Umbenennungsvorgang erfolgreich war.

Wenn Sie Datei zwischen verschiedenen Dateisystem verschieben möchten Sie moveFile Apache verwenden können

-1

Ihre ider ist Fehler beause/some_other_disk/ist relativ url aber völlig url kann nicht die URL finden i Beispiel haben

Java Filemover D: \ Eclipse33_workspace_j2ee \ test \ src \ a \ a.txt D: \ Eclipse33_workspace_j2ee \ test \ src Die Datei Umzug war erfolgreich

Java Filemover D: \ Eclipse33_workspace_j2ee \ test \ src \ a \ a.txt \ Eclipse33_workspace_j2ee \ test \ src

Die Datei Umzug war falsch empfangenen

Ergebnis ist url Fehler ist

+0

jeder Pfad, der mit '/' beginnt, ist ein absoluter Pfad (bei Unices). Also nein. Siehe oben die Antworten für etwas, das die Frage tatsächlich beantwortet. – oligofren

Verwandte Themen