Datei in Ordner auslesen -> neuer Ordnername

Vintner

Mitglied
Hallo,
ich habe folgende Situation:
Es gibt 100 Ordner in einem root-Verzeichnis mit etlichen Unterverzeichnissen. Diese 100 Ordner sollen eine Namenserweiterung erhalten, welche in einer Title-Datei in jedem dieser 100 Ordner steckt, leider taucht diese Datei mehrmals in den Unterordnern auf, i.d.R. zwei Mal. Ich bin soweit, dass ich die Dateien in den Ordnern finde und auslesen kann.
Ich weiß leider nicht so ganz weiter. Könnte man mit einer switch:case anweisung evt. die Unterverzeichnisse durchsuchen die aufhört zu suchen wenn die Datei gefunden wurde? Das ist irgendwie schwierig mit der Switch-Case-Anweisung wegen des rekursiven Aufrufes, dazu bräuchte ich ja eine Flag-Variable die ich setze wenns File gefunden wurde, aber die wird in der Methode Such-Methode ständig überschrieben.
Und dann weiß ich auch nicht so ganz wie ich das mit dem Umbenennen machen soll
Java:
public class OrdnerUmbenennen
{
private static ArrayList<String> rootDirs = new ArrayList<String>();            //Hält alle Verz. zum umbenennen
private static ArrayList<String> erweiterungen = new ArrayList<String>();    //Hält die Namens-Erweiterungen
private static newPos = 0;                                                     //hält die Pos der neuen Namen, in der Liste
private static altPos=0;                                                          //hält die Position der alten Verzeichnise in der Liste                           
//root-Verz. auslesen und Verzeichnispfade speichern
private static void readRoot(String path, String find){
     try{ 
        File maindir = new File(path);  
        File[] files = maindir.listFiles();
        for(int i=0; i<=files.length; i++){
           if(files[i].isDirectory())  
                rootDirs.add(files[i].getAbsolutePath());
        }        
    }catch(Exception e){}
    for(String dir: rootDirs){
            readDir(dir, find);
    }
}
//Unterverzeichnisse nach der Titledatei durchsuchen
private static void readDir(String dir, String find){
    try{ 
        File maindir = new File(dir);  
        File[] files = maindir.listFiles();
        for(int i=0; i<=files.length; i++){
            if(files[i].isDirectory()) {    
                readDir(files[i].getAbsolutePath(), find);
            }
            else (files[i].getName().equalsIgnoreCase(find)){ 
                readTitle(files[i].getAbsolutePath());                        //Titel auslesen lassen
            }
        }
      }catch(Exception e){}
} 
//Title-Datei auslesen
private static void readTitle(String path){
    try{
        BufferedReader br = new BufferedReader(new FileReader(path));
        erweiterungen.add(br.readLine());
    }catch(Exception e){}
}

//Ordner umbenennen
 public static void rename(String alt){
     File Dir = new File(alt);
     String new = alt.get(altPos)+erweiterungen.get(newPos));
     Dir.renameTo(new);
     altPos+=1
     newPos+=2;
    }
} 
//Main-Funktion die alles startet
public static void main(String[] args){
        readRoot("Test", "title");
        for(String alt : rootDirs){
        System.out.print("Rename "+alt+" into ");
        rename(alt);
        }
     }
}
Ich hoffe, das ist nicht allzu unübersichtlich ???:L
 
Zuletzt bearbeitet:
Ich denke das Problem hier ist, dass das rename zunächst das Verzeichniss kopiert zum neuen namen und das alte nicht gelöscht werden kann, weil es in ieienr Weise benutzt wird.

Zumbeispiel liest du Dateien und gibst sie nicht wieder frei.

BufferedReader muss gelossen werden, wenn er nciht mehr benutzt werden soll..
 
Du versuchst einen String mit dem Namen "new" anzulegen, new ist aber ein reserviertes Wort. Ist mir jetzt nur so aufgefallen.

€: Hab deine Frage nicht so ganz verstanden, aber hab mal versucht das Problem zu lösen. Ist nur einfach so runtergetippt, aber vielleicht gibt es dir ja einen Denkanstoß in die richtige Richtung. (Sofern es wirklich annähernd das macht, was du dir wünscht.)

Java:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class OrdnerUmbenennen
{
	public static void main(String[] args) throws FileNotFoundException
	{
		start(new File("C:\\"), "title", true);
	}
	public static void start(File rootFolder, String titleFileName, boolean debugMsgs) throws FileNotFoundException
	{
		if((rootFolder == null || !rootFolder.isDirectory()) || titleFileName == null)
			throw new IllegalArgumentException();
		else if(!rootFolder.exists())
			throw new FileNotFoundException();
		
		File[] rootFolderContent = rootFolder.listFiles();
		for(File f:rootFolderContent)
		{
			File titleFile = findTitle(f, titleFileName, debugMsgs);
			
			if(titleFile != null)
			{
				if(debugMsgs)
					System.out.println("Debug: " + f.getName() + " - Title found.");
				
				String folderSuffix = readFolderSuffix(titleFile, debugMsgs);
				if(folderSuffix != null)
					renameFolders(f, folderSuffix, debugMsgs);
			}
			else if(debugMsgs)
				System.out.println("Debug: " + f.getName() + " - Title not found.");
		}
	}
	private static File findTitle(File f, String titleFileName, boolean debugMsgs)
	{
		File titleFile = null;
		File[] fileContent = f.listFiles();
		
		for(int i = 0, size = fileContent.length; i < size && titleFile == null; i++)
		{
			if(fileContent[i].isDirectory())
				titleFile = findTitle(titleFile, titleFileName, debugMsgs);
			else if(fileContent[i].getName().equals(titleFileName))
				titleFile = fileContent[i];
		}
		return(titleFile);
	}
	private static String readFolderSuffix(File f, boolean debugMsgs)
	{
		String folderSuffix = null;
		BufferedReader reader = null;
		try
		{
			reader = new BufferedReader(new FileReader(f));
			folderSuffix = reader.readLine();
			
			if(debugMsgs)
				System.out.println("Debug: Suffix succefull read.");
		}
		catch (IOException e)
		{
			if(debugMsgs)
				System.out.println("Debug: Error while reading.");
		}
		finally
		{
			try
			{
				if(reader != null)
					reader.close();
			}
			catch (IOException e)
			{
				e.printStackTrace();
			}
		}
		return(folderSuffix);
	}
	private static void renameFolders(File f, String folderSuffix, boolean debugMsgs)
	{
		File[] fileContent = f.listFiles();
		for(File loopFile:fileContent)
		{
			if(loopFile.isDirectory())
			{
				File newFile = new File(loopFile.getAbsolutePath() + folderSuffix);
				if(loopFile.renameTo(newFile))
				{
					if(debugMsgs)
						System.out.println("Debug: " + loopFile.getName() + "was renamed.");
					renameFolders(newFile, folderSuffix, debugMsgs);
				}
				else if(debugMsgs)
					System.out.println("Debug: " + loopFile.getName() + "could not renamed.");
			}
		}
	}
}
 
Zuletzt bearbeitet:
@Marcinek:
Danke, BufferReader war noch offen. Ich verlier immer den Überblick im Code wenn ich mich nicht auf ein Thema konzentriere, da hab ich noch viel zu lernen.
@Volvagia:
Vielen Dank für den Lösungsvorschlag, ich werd' mich da jetzt mal durcharbeiten.

Danke euch beiden 🙂
 
@ Vintner

Was machen denn bei dir die Codezeile 5 und 6 ?

[JAVA=5]
private static newPos = 0;
[/code]
[JAVA=6]
private static altPos=0;
[/code]

Kompiliert der Code überhaupt ?
Also meines Wissens nach fehlt da definitiv ein Datentyp int oder?
 
Ich hab' den Code da oben nur aus Fragmenten zusammengesetzt. Er funktioniert nicht wirklich. Eigentlich brauchte ich nur mal einen Denkanstoß, und den hab' ich ja bekommen 🙂

Das Programm läuft jetzt eig. so wie ich das wollte, blos beim Umbenennen passiert etwas eigenartiges:
Die Ordner die ich gerne umbenennen lassen möchte sind im Ordner Ergebnisse. Z.B.: Ergebnisse/20080908-3-hejo, Ergebnisse/20080908-2-hejo. Wenn ich das Programm mit root Ergebnisse aufrufe, werden nach dem Umbenennen die umbenannten Ordner in das selbe Verzeichnis verschoben, in dem sich auch der Ordner Ergebnisse befindet. Zum Schluß säh das dann so aus:
Test/Ergebnisse, Test/20080908-2-hejo Aldehyd jn2-2, Test/20080908-3-hejo Aldehyd jn2-2 usw.

Könnt ihr da im Quelltext unter der Methode rename(), den Fehler sehen?

[Java]
import java.io.*;
import java.lang.*;
import java.util.*;

public class OrdnerUmbenennen
{
private static ArrayList<String> rootDirs = new ArrayList<String>();
private static ArrayList<String> suffix = new ArrayList<String>();
private static boolean found;


public static void main(String[] args)
{
start();
}
public static void start()
{
try{
readRoot("E:/Dokumente/Test/Test/");
for(String dir : rootDirs){
found=false;
searchFile(dir, "title");
}
rename();
}catch(Exception e){}
}
//Root-Ordner durchsuchen
private static void readRoot(String path)
{
try{
File maindir = new File(path);
File[] files = maindir.listFiles();
for(int i=0; i<=files.length; i++){
if(files.isDirectory())
rootDirs.add(files.getAbsolutePath());
}
}catch(Exception e){}
}
//File in Unterordner von Root suchen
private static void searchFile(String dir, String find)
{
try{
File maindir = new File(dir);
File[] files = maindir.listFiles();
for(int i=0; i<=files.length; i++){
if(files.isDirectory() && found!=true)
searchFile(files.getAbsolutePath(), find);
else if(files.getName().equalsIgnoreCase(find) && found!=true){
found = true;
readTitle(files.getAbsolutePath());
}
}
}catch(Exception e){};
}
//Datei auslesen
private static void readTitle(String path)
{
try{
BufferedReader br = new BufferedReader(new FileReader(path));
String line = " "+br.readLine();
suffix.add(line);
br.close();
}catch(Exception e){}
}
//Ordner umbenennen
public static void rename()
{
for(int i=0; i<=suffix.size(); i++){
File dir = new File(rootDirs.get(i));
String neuerName = (dir.getName()+ suffix.get(i));
dir.renameTo(new File(neuerName));
}
}
}
[/code]
 
Es sieht nach kurzen überfliegen so aus, als würdest du dir einfach eine File-Instanz aus dem Namen zusammenbasteln. Und ein File ohne Partitionangabe ist relativ, sonst absolut. Also legt er den Ordner ausgehend von dem Programm an. Versuche mal statt dir.getName() dir.getAbsolutePath().

btw. solltest du innerhalb einer catch wärend einer Dateioperation immer etwas hineinschreiben. In meinem Fall ist es zwar auch nur eine optionale Debug-Meldung, aber wenn es leer ist erfährt niemand, dass das Lesen schief gelaufen ist, frühestens wenn er allen Ordnern 'null' dranhängt. Und ein Stream/Reader/Writer sollte immer im finally geschlossen werden, wenn er z. B. im readLine eine Exception wirft bleibt er offen.
 

Neue Themen


Zurück
Oben