# Dateien in Ordner einsortieren



## nuely (29. Nov 2008)

Ich schreibe ein Programm mit welchem ich neue MP3-Dateien in meine bestehende MP3-Sammlung einsortieren kann.
Das Programm wird in einem Ordner aufgerufen und soll alle MP3-Dateien darin wegsortieren.
Beispiel:
Das Programm wird aus dem Ordner \Musik\Sortieren aufrufen. Darin befinden sich:
Nelly - Test.mp3
Nelly feat. Justin Timberlake - Test.mp3
Nelly Furtado - Test.mp3
Nelly Fiktiv - Test.mp3

Mein Ziel ist nun, das die Dateien folgendermaßen sortiert werden:
\Musik\N\Nelly\Nelly - Test.mp3
\Musik\N\Nelly\Nelly feat. Justin Timberlake - Test.mp3
\Musik\N\Nelly Furtado\Nelly Furtado - Test.mp3
\Musik\N\Nelly Fiktiv\Nelly Fiktiv - Test.mp3

Wie man sieht hat jeder Interpret einen eigenen Ordner, aber nicht wenn er etwas mit einem anderem zusammen gemacht hat. Das kommt quasi in den Ordner des ersten Interpreten.

Das momentane Programm schafft es die ersten drei richtig zu sortieren, erstellt für den vierten aber keinen neuen Ordner sondern sortiert ihn unter Nelly mit ein.

Ich hoffe jemand kann mir bei der Weiterentwicklung des Algorithmus weiterhelfen.


```
package createOrdner;

import java.io.File;

public class CopyDateien {

	public static void main(String[] args)
	{
		File verzeichnis=new File(".");
		System.out.println(verzeichnis.getAbsolutePath());
		File[] dateien = verzeichnis.listFiles(); 
		if (dateien!=null)
		{
			for (int i=0; i<dateien.length; i++)
			{
				//System.out.println(dateien[i].getAbsolutePath());
				//Wenn Datei kein Ordner, aber eine Standard-MP3-Datei ist wird sie verschoben
				if(dateien[i].isFile()&&dateien[i].getName().endsWith("mp3")&&dateien[i].getName().contains(" - "))
				{
					//Interpreten extrahieren
					String dateiname=dateien[i].getName();
					String anfangsbuchstabe=dateiname.substring(0, 1);
					String interpret=dateiname.substring(0, dateiname.indexOf(" - "));
					//Prüfen ob bereits ein Ordner für diesen Interpreten existiert
					boolean ordnerVorhanden=false;
					String ordner=verzeichnis.getAbsolutePath().substring(0, verzeichnis.getAbsolutePath().lastIndexOf("\\"));
					ordner=ordner.substring(0, ordner.lastIndexOf("\\"));
					ordner=ordner+"\\"+anfangsbuchstabe;
					File unterverzeichnis=new File(ordner);
					File[] interpretenOrdner=unterverzeichnis.listFiles();
					if (interpretenOrdner!=null)
					{
						for (int j=0; j<interpretenOrdner.length; j++)
						{
							if(dateiname.contains(interpretenOrdner[j].getName()+" "))
							{
								ordnerVorhanden=true;
								ordner=interpretenOrdner[j].getAbsolutePath();
							}
						}
					}
					//Wenn bereits ein Ordner vorhanden ist, die Datei hier hinein kopieren
					if (ordnerVorhanden)
					{
						File quelle = new File(dateien[i].getAbsolutePath().replace(".\\", ""));
						File ziel = new File(ordner+"\\"+dateiname);
						if(quelle.renameTo(ziel))
						{
							System.out.println("Datei "+dateiname+" kopiert nach "+ordner);
						}
						else
						{
							System.out.println("Kopieren von "+ordner+"\\"+dateiname+" fehlgeschlagen");
						}
					}
					//Wenn kein Ordner vorhanden ist, Ordner erstellen und Datei anschließend hinein kopieren
					else
					{
						File neu=new File(ordner+"\\"+interpret);
						if(!neu.mkdir()&&!neu.exists())
						{
							System.out.println("Erstellen von "+ordner+"\\"+interpret+" fehlgeschlagen");
						}
						else
						{
							System.out.println("Ordner "+ordner+"\\"+interpret+" erstellt");
						}
						File quelle = new File(dateien[i].getAbsolutePath().replace(".\\", ""));
						File ziel = new File(ordner+"\\"+interpret+"\\"+dateiname);
						if(quelle.renameTo(ziel))
						{
							System.out.println("Datei "+dateiname+" kopiert nach "+ordner+"\\"+interpret);
						}
						else
						{
							System.out.println("Kopieren von "+ordner+"\\"+interpret+"\\"+dateiname+" fehlgeschlagen");
						}
					}
				}
			}
		}
	}

}
```


----------



## hdi (30. Nov 2008)

Ich hab mir jetz deinen ganzen Code nich komplett angeschaut, aber ich finde es seltsam, dass das 3.Lied nen eigenen Ordner kriegt, das 4.Lied aber nicht...

Vllt vergisst du in der Schleife irgendwas zurückzusetzen, nachdem ein Ordner angelegt wurde, oder kA.

Hast du das schonmal versucht ohne dem 3.Lied? Hast du dann am Ende auch nur 1 Ordner "Nelly" und dort 
ist auch das 4.Lied drinnen?


----------



## nuely (30. Nov 2008)

ja das ist genauso. Die wichtigen Zeilen sind eigentlich 35-38.


----------



## didjitalist (30. Nov 2008)

verzeichnisse werden in undefinierter reihenfolge abgearbeitet. d.h. es wird z.b. erst der ordner "Nelly Furtado" erzeugt, dann ein ordner "Nelly" und in zeile 35 stellst du fest, dass "Nelly " in "Nelly Fiktiv" vorkommt und schmeisst die letzte datei also in den "Nelly" ordner.


----------



## hdi (30. Nov 2008)

Also erstmal solltest du zwischen Zeile 29 und 30 das hier einfügen:


```
unterverzeichnis.mkdir();
```

Das gilt auch für jeden Unterordner den du in diesem Prozess erstellst. du erstellst bisher nur den finalen
Ornder, was aber immer fehlschläft weil der Ober-Ordner dazu noch nicht mal angelegt wurde.
Du willst ja wohl nicht selber erstmal einen Ornder für das ganze Alphabet anlegen, oder? weil sonst
schläft das kopieren immer fehl.

So, mir haut er alle 4 Lieder in den Ornder "Nelly".Kann es sein dass du hier veralteten Code gepostet hast?


----------



## didjitalist (30. Nov 2008)

bei dir wird wahrscheinlich zufällig zuerst ein ordner "Nelly" erzeugt.


----------



## hdi (30. Nov 2008)

ja hab deine antwort auch erst jetzt gelesen.

Is ja krass... ist das echt "undefiniert"? Wie soll man da überhaupt irgendwas mit Datei-Bearbeitung in Java
machen?


----------



## nuely (30. Nov 2008)

didjitalist hat gesagt.:
			
		

> verzeichnisse werden in undefinierter reihenfolge abgearbeitet. d.h. es wird z.b. erst der ordner "Nelly Furtado" erzeugt, dann ein ordner "Nelly" und in zeile 35 stellst du fest, dass "Nelly " in "Nelly Fiktiv" vorkommt und schmeisst die letzte datei also in den "Nelly" ordner.



genau das ist das Problem. Und da weiß ich momentan nicht wie ich das lösen kann.



			
				hdi hat gesagt.:
			
		

> Also erstmal solltest du zwischen Zeile 29 und 30 das hier einfügen:
> 
> 
> ```
> ...



Die 26 Ordner für Alphabet gibt es schon, denn wie gesagt geht es darum neue Dateien in die bestehende Struktur einzufügen.

Der Code ist aktuell. Vermutlich hat didjitalist recht.


----------



## didjitalist (30. Nov 2008)

hdi hat gesagt.:
			
		

> Is ja krass... ist das echt "undefiniert"? Wie soll man da überhaupt irgendwas mit Datei-Bearbeitung in Java machen?


das ist nicht nur in java so. die reihenfolge ist natürlich nicht zufällig, die wird vom betriebssystem vorgegeben. das hat aber nix mit alphabetischer reihenfolge oder so zu tun. man muss sich halt selbst darum kümmern, in welcher reihenfolge abgearbeitet wird. es ist ja kein problem, ein verzeichnis einzulesen und die struktur erstmal zu sortieren. man darf sich nur niemals darauf verlassen, dass methoden wie File#listFiles() irgendeine ordnung einhalten


----------



## nuely (7. Dez 2008)

da ich keine Lösung über einen Algorithmus finden konnte habe ich jetzt eine Abfrage mit eingebaut.


```
if(dateiname.contains(interpretenOrdner[j].getName()+" "))
							{
								if (interpret.equals(interpretenOrdner[j].getName()))
								{
									ordnerVorhanden=true;
									ordner=interpretenOrdner[j].getAbsolutePath();
								}
								else
								{
									String message="Ist der Ordner "+
									interpretenOrdner[j].getName()+
									" korrekt für den Interpreten "+
									interpret;
									int antwort=JOptionPane.showConfirmDialog(null, message, "Korrekter Ordner", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
									switch (antwort)
									{
									case JOptionPane.YES_OPTION:
										ordnerVorhanden=true;
										ordner=interpretenOrdner[j].getAbsolutePath();
										break;
									case JOptionPane.NO_OPTION:
										ordnerVorhanden=false;
										break;
									case JOptionPane.CANCEL_OPTION:
										System.exit(0);
									}
								}
							}
```


----------



## didjitalist (8. Dez 2008)

```
String[] tokens = String.split( "-", file.getName() );
```
wenn der dateiname deinem pattern entspricht, dann hast du mit

```
tokens[ 0 ].trim();
```
den namen des verzeichnisses.


----------



## nuely (8. Dez 2008)

das allein reicht halt nicht. Dann würde Nelly feat. Justin Timberlake - Test.mp3 einen eigenen Ordner Namens Nelly feat. Justin Timberlake erstellen.


----------

