# Datei umbenennen mit Java



## Kerrl (24. Jan 2010)

Hallo,
ich bin ganz neu im Java-Forum und habe eine Frage zur Umbenennung von Dateien.
Habe mir ein paar Sachen, unter Anderem den API-Eintrag durchgelesen.

Mit meinem Code wird eine Datei nciht umbenannt, sondern entfernt.
Der verwendete Aufruf von renameTo (Zeile 63) in meiner Methode replacer gibt mir true zurück.


```
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;

public class FilenameChanger
{
	static ArrayList<String> files = new ArrayList<String>();
	static HashMap<String, String> umlauts = new HashMap<String, String>();

	public static void main(String[] args)
	{
		umlauts.put("ä", "ae");
		umlauts.put("Ä", "Ae");
		umlauts.put("ö", "oe");
		umlauts.put("Ö", "Oe");
		umlauts.put("ü", "ue");
		umlauts.put("Ü", "Ue");
		umlauts.put("ß", "ss");

//		browseFiles(new File("/media/"));
		
		browseFiles(new File("/home/fasp/Desktop"));

		//output of found files
		for (String s : files)
		{
			System.out.println(s);
		}
	}

	//walks through all files and folders of the passed root
	private static void browseFiles(File root)
	{
		File[] content = root.listFiles();

		for (File f : content)
		{
			if (f.isDirectory())
			{
				browseFiles(f);
			}

			// action on found files:
			else if (f.isFile())
			{
				replacer(f);
				//adder(f);
			}
		}
	}

	//replaces all umlauts in f's name with common letters
	private static void replacer(File f)
	{
		for (String umlaut : umlauts.keySet())
		{
			if (f.getName().contains(umlaut))
			{
				String newName = f.getName().replaceAll(umlaut,
						umlauts.get(umlaut));
				
				boolean success=f.renameTo(new File(newName));
				System.out.println(f.getAbsolutePath()+" renamed: "+success);
				
				int debug = 42;
			}
		}
	}

	//adds f to the list if it matches the specified criterium
	private static void adder(File f)
	{
		for (String umlaut : umlauts.keySet())
		{
			if (f.getName().contains(umlaut))
			{
				files.add(f.getAbsolutePath());
			}
		}
	}
}
```

Woran liegt es, dass es nicht klappt?

Gruß


----------



## eRaaaa (24. Jan 2010)

Das Problem ist wohl, dass du dir den Dateinamen holst und diesen veränderst -> soweit so gut.
Nun erstellst du aber in renameTo ein neues File-Objekt, von genau diesem String, also nur von dem Dateinamen, ohne Pfad ! 


> renameTo(File dest)
> Renames the file denoted by this abstract pathname



Du musst also auch schon noch vorher den Pfad anhängen, sonst verschiebst du quasi die Datei in das Verzeichnis, von wo du das Programm startest (glaube dass die Datei jetzt dort liegt, wohin genau verschoben wird, bin ich mir gerad selbst nicht sicher) Gelöscht ist sie also nicht, sie wurde umbenannt und liegt jetzt woanders


----------



## Kerrl (24. Jan 2010)

Vielen Dank,

so funktioniert es:

```
//replaces all umlauts in f's name with common letters
	private static void replacer(File f)
	{
		for (String umlaut : umlauts.keySet())
		{
			if (f.getName().contains(umlaut))
			{

				String location=f.getAbsolutePath().substring(0,f.getAbsolutePath().length()-f.getName().length());
				String newName = f.getName().replaceAll(umlaut,
						umlauts.get(umlaut));
				
				
				boolean success=f.renameTo(new File(location+newName));
				System.out.println(f.getAbsolutePath()+" renamed: "+success);
				
				int debug = 42;
			}
		}
	}
```


----------



## Kerrl (24. Jan 2010)

Ich habe aber festgestellt, dass sich eine Datei nur einmal umbenennen lässt.
Wenn der Dateiname mehrere Umlaute enthält, zB ägü.txt, wird nur der Umlaut ersetzt, der zuerst erkannt wurde.
Beim nächsten Umlaut in der foreach-Schleife gibt die renameTo-Methode false zurück.
Woran mag das liegen?
Gruß


----------



## eRaaaa (24. Jan 2010)

Mhm ich denke weil f immer noch der alte Pfad/Dateiname ist in deinem Programm(du änderst f ja nicht) und wenn er dann versucht diese umzubennen gibts halt einen Fehler, ist ja klar, weil es diese Datei ja garnicht mehr gibt!
Ähhm aber wieso durchläufst du nicht erstmal komplett die Schleife, änderst den Dateiname korrekt und benennst dann erst die Datei um?


----------



## Kerrl (24. Jan 2010)

Achso, renameTo verändert gar nicht das File-Objekt f, auf das replacer ausgeführt wird, sondern baut ein ganz neues


----------



## Kerrl (24. Jan 2010)

Davon abgesehen kann ich auch mit 1x ändern auskommen


----------

