Unterordner werden nicht umbenannt.


#1
Hallo,
Ich wollte einen Algorithmus zum umbenennen von Ordnern und deren Unterordnern erstellen.
Zum Beispiel Habe ich in einem Verzeichnis einen Ordner namens "ja" und "hallo". Und im Ordner "ja" noch einen Unterordner namens "hallo". Jetzt will ich, dass alle Ordner namens "hallo" zu "TEST" umbenannt werden. Aber das funktioniert nur teilweise.
Ich hoffe das ist keine dumme Frage und ihr könnt mir helfen :)

Konsolen Output:
---VERZEICHNIS ERSTELLT---
---ERGEBNISSE---
C:\Users\Michadaniel\IdeaProjects\Tests\test\hallo
true
C:\Users\Michadaniel\IdeaProjects\Tests\test\hallo\nein\hallo
false

Java:
package misc;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class DirReplace {

    static File[] dics = new File[5];

    public static void main(String[] args) {
        resetDirectorys();
        String string = "hallo";
        List<File> files = listDir(dics[0]);
        System.out.println("---ERGEBNISSE---");
        for (File f : files) {
            if (f.getAbsolutePath().endsWith(string)) {
                System.out.println(f.getAbsolutePath());
                System.out.println(f.renameTo(new File(replace(string, "TEST", f.getAbsolutePath()))));
            }
        }
    }

    public static String replace(String suche, String ersatz, String str) {
        int start = str.indexOf(suche);

        while (start != -1) {
            str = str.substring(0, start) + ersatz + str.substring(start + suche.length(), str.length());
            start = str.indexOf(suche, start + ersatz.length());
        }
        return (str);
    }

    public static void resetDirectorys() {
        dics[0] = new File("test");
        dics[1] = new File("test/ja");
        dics[2] = new File("test/hallo");
        dics[3] = new File("test/hallo/nein");
        dics[4] = new File("test/hallo/nein/hallo");

        if (dics[0] != null) {
            for (File f : dics) {
                DirEdit.deleteDir(f);
            }
        }

        dics[0].mkdir();
        dics[1].mkdir();
        dics[2].mkdir();
        dics[3].mkdir();
        dics[4].mkdir();

        System.out.println("---VERZEICHNIS ERSTELLT---");
    }

    private static List<File> fileList = new ArrayList<>();

    public static List<File> listDir(File dir) {

        File[] files = dir.listFiles();
        if (files != null) {
            for (int i = 0; i < files.length; i++) {
                if (files[i].isDirectory()) {
                    fileList.add(files[i]);
                    listDir(files[i]);
                }
            }
        }
        return fileList;
    }
}
vorher.PNG nachher.PNG
 

Anhänge

Zuletzt bearbeitet von einem Moderator:
#2
Moin,
bitte poste Deinen Code nicht als Anhang, sondern direkt mit den entsprechenden Code-Tags - enmtweder über das Icon links vom Diskettensysmbol oder mit
[_code=Java_] ...meinTollerCode... [_/code_]
ohne die Unterstriche!!

Dann sieht man Zeilenummern auf die man sich beziehen kann und es läßt sich vernünftig etwas zitieren !
Gruß Klaus
 

Bratkartoffel

gebratene Kartoffel
Premium-User
#3
Hi,

du erstellst die Liste mit den Verzeichnissen ganz am Anfang deines Codes. Benennst du nun einen der Ordner um, so werden alle FileInstanzen die du schon erstellt hast und auf ein Unterverzeichnis zeigen ungültig.
Lösung (Möglichkeiten):
- Nachdem ein Ordner umbenannt wurde erstellst du eine neue Liste und fängst bei dieser wieder bei 0 an
- Du gehst die Liste rückwärts durch (also erst die untersten Ordner umbenennen, dann die Eltern usw)

Grüsse,
BK
 
#4
Das habe ich auch schon probiert hat aber nicht funktioniert :/
Java:
public static void main(String[] args) {
        resetDirectorys();
        String string = "hallo";
        List<File> files = listDir(dics[0]);
        List<File> reversedFiles = Lists.reverse(files);
        for (File f : reversedFiles) {
            if (f.getAbsolutePath().endsWith(string)) {
                System.out.println(f.getAbsolutePath());
                f.renameTo(new File(replace(string, "TEST", f.getAbsolutePath())));
            }
        }
    }
Die Klasse Lists habe ich von "com.google.common.collect.Lists"
 
Zuletzt bearbeitet:
#5
#7
Seltsamer Weise geht das auch schief:
Java:
System.out.println(new File("C:\\Users\\Michadaniel\\IdeaProjects\\Tests\\test\\hallo\\nein\\hallo")
                .renameTo(new File(replace("hallo", "TEST", "C:\\Users\\Michadaniel\\IdeaProjects\\Tests\\test\\hallo\\nein\\hallo"))));
 

Bratkartoffel

gebratene Kartoffel
Premium-User
#9
Hi,

warum schreibst du dir die replace() Methode selber und verwendest nicht die String.replace()?
Gibt es einen besonderen Grund warum du die Google-Lists zum sortieren verwendest und nicht die Collections.reverse()?

Deine Problemstellung würde ich in etwa so angehen (Pseudo Code):
- List all folders under X (recursive) which do not have any subfolders (tree leaves)
- LOOP for each folder
-- SET current_folder = folder
-- LOOP until current_folder = X
--- COMAPRE name(current_folder) == "hallo"?
---- TRUE: do rename operation
---- FALSE: do nothing
--- SET current_folder = parent(current_folder)
-- END LOOP
- END LOOP

Würde das Ganze dann mit Java NIO umsetzen (Files.find(), Files.move(), Path)

Grüsse,
BK
 
Zuletzt bearbeitet:

Bratkartoffel

gebratene Kartoffel
Premium-User
#11
Hi,

die eigentliche Logik ist nur wenige Zeilen lang:
Java:
// Recursivly list all directories which have the searched name
final List<Path> matches = Files.find(target, 10, (path, attr) -> (attr.isDirectory() && path.endsWith(search)))
		.sorted().collect(Collectors.toList());

// reverse the result list
Collections.reverse(matches);

// loop over the found folders
for (final Path oldName : matches) {
	// create the new name
	final Path newName = oldName.resolveSibling(replace);

	// rename them
	Files.move(oldName, newName, StandardCopyOption.ATOMIC_MOVE);

	// some log output
	System.out.printf("%-25s => %s\n", oldName, newName);
}
Komplett mit simplen Test: https://gist.github.com/bratkartoffel/e07f66010aa396f3cb7a

Grüsse,
BK