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"));
}
}
Errr ... didnt Ihre Antwort während laden Ich komponiere meins :), moveFile ist der Retter +1 – mprabhat
Ihr Vorschlag auf Apache Commons war genau mein nächster Schritt. Danke für eine informative Antwort, die tatsächlich beide Fragen beantwortet! – oligofren
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