renameTo()

BlubBlub

Bekanntes Mitglied
Hi,

ich verste die methode renameTo() der klasse File nicht so ganz.
public boolean renameTo(File dest)

in der api steht, dass ich mit dem aufruf eine bestehende datei umbennen kann.

Java:
File myFile = new File("alt.txt");
myFile.renameTo(new File("neu.txt"));
dieser code müsste mir also die datei alt.txt in neu.txt umbennen.
doch in wirklichkeit wird alt.txt kopiert. neu.txt erhält dann den inhalt von alt.txt.
alt.txt existiert aber weiterhin.

zudem liefer mir folgender code dieses ergebnis:
C:\Users\Me\workspace\Editor\alt.txt
alt.txt
alt.txt
C:\Users\Me\workspace\Editor\alt.txt
alt.txt
alt.txt

Java:
File myFile = new File("alt.txt");
System.out.println(myFile.getAbsolutePath());
System.out.println(myFile.getPath());
System.out.println(myFile.getName()); 

myFile.renameTo(new File("neu.txt"));
System.out.println(myFile.getAbsolutePath());
System.out.println(myFile.getPath());
System.out.println(myFile.getName());

eigentlich sollten die letzten drei prints, aber dann neu.txt finde ich zurückliefern.
wie krieg ichs also hin dass meine alte datei einen neuen namen erhält ohne kopiert zu werden?
 
Zuletzt bearbeitet:

XHelp

Top Contributor
In wie fern hat es was mit awt und swing zu tun? :bahnhof:
Was sagt denn die Variable, die dir zurückgegeben wird? Fliegen Exceptions?
 

BlubBlub

Bekanntes Mitglied
hmm stimmt ist eigentlich gar nicht der richtige foren unterpunkt.
ich verwende aber den JFileChooser um an die Files zu kommen, daher
hab ich das verkehrterweise hier reingeschrieben.

nein exceptions werden nicht geworfen. ich führ es ja richtig aus.
mich verwunderts aber einfach, dass keine umbennenung der datei stattfindet,
sondern, dass eine kopie der datei unter neuem namen erstellt wird,
was aber eigentlich dem wortlaut der api beschreibung widerspricht.

renameTo

public boolean renameTo(File dest)

Renames the file denoted by this abstract pathname.

Many aspects of the behavior of this method are inherently platform-dependent: The rename operation might not be able to move a file from one filesystem to another, it might not be atomic, and it might not succeed if a file with the destination abstract pathname already exists. The return value should always be checked to make sure that the rename operation was successful.
 

XHelp

Top Contributor
Eigentlich widerspricht es nicht der API. Da steht, es muss nicht atomar sein: es kann auch als copy()+delete() umgesetzt sein.
Ich vermute mal, dass er zwar Datei A in Datei B kopieren kann, aber Datei A nicht löschen kann.

Wie gesagt: schau dir an, was zurückgegeben wird.

nein exceptions werden nicht geworfen. ich führ es ja richtig aus.
Es hat ja nichts mit richtig ausführen zu tun.
 
Zuletzt bearbeitet:

Murray

Top Contributor
Das Umbenennen kann man durchaus als Kopieren unter dem neuen Namen und Löschen der Ursprungsdatei implementieren. Wie die Doku schon sagt, ist die Methode nicht atomar, so dass nicht gesichert ist, dass entweder alle Teiloperationen oder gar keine ausgeführt werden; insofern können im Fehlerfall u.U. unerwartete Zwischenstände entstehen.
Du solltest auf jeden Fall a) den Rückgabewert der renameTo-Methode prüfen (bei false hat das Umbennen nicht (vollständig) geklappt), b) vor dem Umbennen mit File#canWrite testen, ob die Ursprungsdatei beschreibbar ist (anderenfalls kann sie auch nicht gelöscht werden) und c) ebenfalls vor dem Umbennen mit File#exists prüfen, ob die Zieldatei nicht etwa bereits vorhanden ist.
 

slawaweis

Bekanntes Mitglied
das Verhalten von renameTo() hängt vom Betriebssystem ab, denn es werden die nativen Funktionen aufgerufen. Das Problem kann auch bei den Schreibrechten liegen. Entweder hat das Programm keine Rechte eine Datei zu überschreiben oder zu löschen.

Ich denke das Problem hier liegt darin, dass die Datei "neu.txt" bereits existiert. Ist es der Fall, wird diese nicht überschrieben und so wird auch "alt.txt" nicht umbenannt. Also vorher auf Existenz prüfen, gegebenenfalls löschen und noch mal testen, ob es weg ist. Weiterhin sollte man sicher sein, dass im aktuellen Programm "alt.txt" nicht geöffnet ist, denn dann würde renameTo() auch scheitern.

Slawa
 
M

Marcinek

Gast
Hallo,

wenn ich ein File Objekt habe, dann zeigt das IMMER auf die Datei, auf die ich es lege.

Nach einem Rename brauchst du ein neues Objekt, dass auf die neue Datei zeigt.

Sonst ändert sich da natürlich nix.

Ansonsten sollten alle offenen FileStreams beendet werden.
 
Zuletzt bearbeitet von einem Moderator:

BlubBlub

Bekanntes Mitglied
ich hab mal ein kleines test programm geschrieben mit renameTo

Java:
import java.io.File;
import java.io.IOException;




public class test {

	public static void main(String[] args) {
		
		File saveFile = new File("SaveFile.txt");
		boolean created = false;
		System.out.println("new File");
		
		try
		{
			created = saveFile.createNewFile();
		}
		catch(IOException ioe)
		{
			System.out.println("Datei Fehler");
		}
		
		if(created)
			System.out.println("Great");
		else System.out.println("Not Great");
		
		System.out.println("Absoluter Pfad: " + saveFile.getAbsolutePath());
		
		if(saveFile.isFile())
			System.out.println("isFile");
		else System.out.println("isNotFile");
		
		   boolean saved = saveFile.renameTo(new File("NEUEDATEI.txt"));
		   if(saved == true)
			   System.out.println("true");
		   else
			   System.out.println("false");
		   
		   System.out.println(saveFile.getName());
	}
	
}

Dabei wird folgendes ausgeben
new File
Great
Absoluter Pfad: C:\Users\Me\workspace\Test\SaveFile.txt
isFile
true
SaveFile.txt

Wenn ich mir die Datei anschaue dann wurde die Datei auch tatsächlich umbenannt.
Mich wunderts allerdings, dass ich mit dem letzten System.out.println, dennoch den ursprünglichen Namen erhalte.
 

Ähnliche Java Themen

Neue Themen


Oben