NIO.2: Dateien kopieren und verschieben
0 Kommentar(e). Veröffentlicht von Christian Ullenboom am Donnerstag, Juli 30, 2009.Zum Kopieren und Verschieben von Dateien und Verzeichnissen bietet die Path-Klasse insgesamt zwei Methoden an:
· Path copyTo( Path target, CopyOption... options ) throws IOException
· Path moveTo( Path target, CopyOption... options ) throws IOException
Da CopyOption ein Vararg ist, ist der Aufruf ohne Zusatzoptionen sehr einfach – nur ein Zielort muss angegeben werden. Beide Operationen führen zu einer IOException, wenn die Dateien/Verzeichnisse nicht kopiert oder verschoben werden konnten. Das ist insbesondere wichtig, wenn sich die Dateiattribute nicht übertragen lassen. Das bringt uns zu den optionalen CopyOption-Elementen. CopyOption ist eine Schnittstelle, die von zwei Aufzählungen StandardCopyOption und LinkOption wie folgt implementiert werden:
java/nio/file/StandardCopyOption.java, StandardCopyOption
public enum StandardCopyOption implements CopyOption
{
REPLACE_EXISTING,
COPY_ATTRIBUTES,
ATOMIC_MOVE;
}
java/nio/file/LinkOption.java, LinkOption
public enum LinkOption implements OpenOption, CopyOption
{
NOFOLLOW_LINKS;
}
StandardCopyOption und LinkOption stellen somit gültige Argumente für copyTo() und moveTo() dar. Die Bedeutung der Aufzählungselemente ist wie folgt:
| Argument | Bedeutung bei copyTo() | Bedeutung bei moveTo() |
| REPLACE_EXISTING | Ersetzt falls vorhanden die Datei bzw. das Verzeichnis am Zielort. Ist das Ziel ein existierender symbolischer Link, so wird nur der Link selbst ersetzt, aber nicht die Datei/der Verzeichnis, auf die der Link zeigt. | |
| COPY_ATTRIBUTES | Versucht alle Attribute zu kopieren. | - |
| NOFOLLOW_LINKS | Ist der Path ein Link, so wird nur der Link selbst kopiert, aber nicht die Datei, auf die der Link zeigt. | - |
| ATOMIC_MOVE | - | Führt das Verschieben (also Anlegen der Kopie und Löschen des Originals) atomar durch. Führt zu AtomicMoveNotSupportedException, falls das Dateisystem dies nicht unterstützt. |
Falls REPLACE_EXISTING nicht angegeben ist, um im Zielordner schon eine Datei/ein Verzeichnis existiert, lösen copyTo() und moveTo() eine FileAlreadyExistsException aus. Das Kopieren von Dateien ist nicht automatisch atomar und eine Option lässt sich auch nicht setzen.
Im Fall von Verzeichnissen wird copyTo() nur ein leeres Verzeichnis anlegen, aber nicht die Dateien eines Quellverzeichnisses automatisch mitkopieren. Das muss per Hand übernommen werden (Files.walkFileTree() ist für diesen Fall ganz gut geeignet und hilft beim Ablaufen von Verzeichnisbäumen.) Die Semantik bei moveTo() und nicht-leeren Verzeichnissen ist komplizierter, da es hier darauf ankommt, ob es sich um ein Verschieben auf dem lokalen Dateisystem handelt (also eine Art umbenennen), oder ein Verschieben auf zum Beispiel einem anderen Laufwerk. Wenn die Einträge in einem Verzeichnis wirklich auf einem anderen Dateisystem verschoben werden müssen, so übernimmt moveTo() diese Arbeit nicht; hier müssen wird selbst per copyTo() auf der Ebene der einzelnen Einträge kopieren.
Labels: Insel

0 Antwort(en) auf ›NIO.2: Dateien kopieren und verschieben‹
Kommentar veröffentlichen