2009-12-16 5 views
16

Ich bin ein wenig verwirrt mit all diesen neuen Datei I/O-Klassen in JDK7.Wie kann ich eine Datei in JDK7 umbenennen (nicht verschieben)?

Sagen wir mal, ich habe eine Path und möchte die Datei umbenennen, sie repräsentiert.
Wie gebe ich den neuen Namen an, wenn wieder ein Path erwartet wird?

Path p = /* path to /home/me/file123 */; 
Path name = p.getName(); /* gives me file123 */ 
name.moveTo(/* what now? */); /* how to rename file123 to file456? */ 

HINWEIS: Warum benötige ich JDK7? Handhabung von symbolische Links!

Problem ist: Ich muss es mit Dateien machen, welche Namen und Orte zur Laufzeit bekannt sind. Also, was ich brauche, ist eine sichere Methode (ohne außergewöhnliche Nebenwirkungen), um einen neuen Namen-Pfad eines alten Namens-Pfades zu erstellen.

Path newName(Path oldName, String newNameString){ 
    /* magic */ 
} 

Antwort

6

Sie haben eine Pfadzeichenfolge und Sie brauchen einen Pfad Instanz zu erstellen. Sie können dies mit der Methode getPath tun oder auflösen. Hier ist eine Möglichkeit:

Path dir = oldFile.getParent();   
    Path fn = oldFile.getFileSystem().getPath(newNameString); 
    Path target = (dir == null) ? fn : dir.resolve(fn);   
    oldFile.moveTo(target); 

Beachten Sie, dass es überprüft, ob Eltern null ist (sieht aus wie Ihre Lösung nicht tun).

0

Falls der Zielpfad zum Quellpfad außer für den Namen der Datei identisch ist, wird es nicht bewegt umbenannt werden.

Also für Ihr Beispiel die moveto Pfad sollte

/home/me/file456 
+1

Also kann ich nur einen neuen 'Pfad' erstellen? Ist etwas einfacher als: Pfad newName = Paths.get (name.getParent(). ToString() + pathSeparator + "newName"); ? –

+0

Ja, jetzt lautet die Frage: Wie kann man einen solchen Pfad auf sichere Weise erstellen, so dass keine außergewöhnlichen Umstände ihn zum Scheitern bringen würden? –

+0

Ich könnte versuchen, zu beschreiben, wie Sie den ursprünglichen Pfad nehmen, den Namen 'file123' abziehen können, verketten 'file456' statt und rufen Sie 'name.moveTo()' auf, aber da ich Java wirklich nicht kenne, würde ich raten .Was ich sicher bin, ist, dass ein * move * zu einem * rename * wird, wenn nur der Dateiname anders ist. – pavium

1

sein, wenn Sie einen Blick auf Apache Commons IO nehmen es gibt eine Klasse namens FileNameUtils. Das macht eine Menge Sachen. Dateipfadnamen und wird (unter anderem) zuverlässig Pfadnamen usw. aufteilen. Ich denke, das sollte einen weiten Weg in Richtung auf das bringen, was Sie wollen.

+0

Entschuldigung, ich brauche symbolische Links-APIs. All diese Apache Commons-Sachen sind bestenfalls Java-5-kompatibel, aber meistens Java-1.4. –

+0

Hilft es Ihnen nicht rein beim Aufteilen und Zusammenfügen von Dateinamen, und Sie können Java 7 Symlink-Aware verwenden, um das Kopieren/Umbenennen tatsächlich durchzuführen? –

+0

Gute Funktionalität für die Handhabung von Symlinks wird nur von JDK7 bereitgestellt, da es Bindings auf niedriger Ebene (binäre Ebene) zum Betriebssystem hat. –

4

OK, nachdem alles auszuprobieren, es scheint, dass ich die richtige Methode gefunden:

// my helper method 
Path newName(Path oldFile, String newNameString){ 
    // the magic is done by Path.resolve(...) 
    return oldFile.getParent().resolve(newNameString); 
} 

// so, renaming is done by: 
oldPath.moveTo(newName(oldFile, "newName")); 
0

Wenn Sie Java nicht dazu bringen können, mit Unix das zu tun, was Sie wollen, empfehle ich Python-Skripte (ausgeführt von Ihrem Java-Programm). Python hat Unterstützung für Unix-Scripting bekommen und es ist nicht Perl :) Dies mag für Sie unelegant klingen, aber wirklich in einem größeren Programm profitieren Sie davon, das richtige Werkzeug für den Job zu verwenden.

47

In JDK7 stellt Files.move() eine kurze und prägnante Syntax für das Umbenennen von Dateien:

Path newName(Path oldName, String newNameString){ 
    return Files.move(oldName, oldName.resolveSibling(newNameString)); 
} 

Zuerst bekommen wir den Pfad zu dem neuen Namen Datei mit Path.resolveSibling() und denen wir Files.move() verwenden, um die tatsächlichen Umbenennung zu tun .