[FIXED] Benennen Sie alle Dateien in Unterverzeichnissen um und legen Sie sie in ihrem jeweiligen übergeordneten Verzeichnis im Zielordner ab

Ausgabe

Ich habe folgende Ordnerstruktur

.
└── sample/
    ├── A-Star/
    │   ├── bonnet.png
    │   ├── center of front bumper.png
    │   └── center of rear bumper.png
    ├── Alto/
    │   ├── bonnet.png
    │   ├── center of front bumper.png
    │   └── center of rear bumper.png
    └── Suzuki/
        ├── bonnet.png
        ├── center of front bumper.png
        └── center of rear bumper.png  

Ich möchte das Verzeichnis einzeln durchlaufen und dann den Dateinamen in Großbuchstaben umwandeln, für ein einzelnes Wort, wie es bonnet.pngsein sollte BONNET.png, aber für einen Dateinamen mit Leerzeichen wie .center of front bumperCENTER_OF_FRONT_BUMPER.png

Die Ausgabe sollte wie folgt aussehen

.
└── sample/
    ├── A-Star/
    │   ├── bonnet.png
    │   ├── center of front bumper.png
    │   └── center of rear bumper.png
    ├── Alto/
    │   ├── bonnet.png
    │   ├── center of front bumper.png
    │   └── center of rear bumper.png
    ├── Suzuki/
    │   ├── bonnet.png
    │   ├── center of front bumper.png
    │   └── center of rear bumper.png
    └── output/
        ├── A-Star/
        │   ├── BONNET.png
        │   ├── CENTER_OF_FRONT_BUMPER.png
        │   └── CENTER_OF_REAR_BUMPER.png
        ├── Alto/
        │   ├── BONNET.png
        │   ├── CENTER_OF_FRONT_BUMPER.png
        │   └── CENTER_OF_REAR_BUMPER.png
        └── Suzuki/
            ├── BONNET.png
            ├── CENTER_OF_FRONT_BUMPER.png
            └── CENTER_OF_REAR_BUMPER.png

Ich habe einen folgenden Code geschrieben, aber er funktioniert nicht wie erwartet.

Erstens kann es den Dateinamen in Großbuchstaben schreiben (ohne angehängten Unterstrich), aber es erstellt kein übergeordnetes Verzeichnis und kopiert die darin enthaltenen Dateien, ohne das übergeordnete Verzeichnis zu erstellen.

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;

public class Test {
    public void listFiles(String startDir) throws IOException {
        File dir = new File(startDir);
        File[] files = dir.listFiles();

        if (files != null && files.length > 0) {
            for (File file : files) {
                // Check if the file is a directory
                if (file.isDirectory()) {
                    // We will not print the directory name, just use it as a new
                    // starting point to list files from
                    listFiles(file.getAbsolutePath());
//                    Path source = file.toPath();
//                    Files.move(source, source.resolveSibling(file.getName().toUpperCase()));
                } else {
                    String path = "D:" + File.separator + "sample" + File.separator + "After Rename";
                    // Use relative path for Unix systems
                    File f = new File(path);
                    f.getParentFile().mkdirs(); 
                    f.createNewFile();
           
                    // We can use .length() to get the file size
//                  String DestinationPath="D:\\sample\\After Rename";
                    Path source = file.toPath();
                    File oldFile = new File(source.toString());
                    file.getParentFile().mkdirs(); 
                    file.createNewFile();
                    file.getName().toUpperCase();
//                    File newFile = new File(path,file);
////                    Files.move(source, source.resolveSibling(file.getName().toUpperCase()));
//                    oldFile.renameTo(newFile);
                    System.out.println(""+oldFile.getName());
//                    System.out.println(file.getName() + " (size in bytes: " + file.length()+")");
                }
            }
        }
    }
    public static void main(String[] args) throws IOException {
        Test test = new Test();
        String startDir = ("D:\\sample");
        test.listFiles(startDir);
    }
}

Lösung

Die Verwendung von Fileund rekursiv File.listFiles()macht die Logik schwieriger nachzuvollziehen. Erwägen Sie, zu wechseln, Files.findwas mit einer kleinen Menge Code einen Verzeichnisscan erzeugen kann:

public static void main(String[] args) throws IOException {

    Path src = Path.of(args[0]);
    Path dst = Path.of(args[1]);

    try (Stream<Path> stream = Files.find(src, Integer.MAX_VALUE, (path, attr) -> attr.isRegularFile())) {
        stream.forEach(System.out::println);
    }
}

Das obige gibt nur die Namen der zu verarbeitenden Dateien aus. Dann können Sie die Aktion gegen etwas austauschen, das die Umbenennung durchführt, und angepasst werden, um die Aktion zum Erstellen von Verzeichnissen vor dem Kopieren anzuwenden:

try (Stream<Path> stream = Files.find(src, Integer.MAX_VALUE, (path, attr) -> attr.isRegularFile())) {
    stream.forEach(file -> {
        // Work out new file name converting basename to uppercase:
        String fn = file.getFileName().toString();
        int dot = fn.lastIndexOf('.');
        if (dot > 0)
            fn = fn.substring(0,dot).toUpperCase().replace(' ', '_') + fn.substring(dot);

        // Work out where to copy the new file under the same path of the dst directory:
        Path target = dst.resolve(src.relativize(file)).resolveSibling(fn);
            System.out.println("Files.createDirectories("+target.getParent()+");");
            System.out.println("Files.copy("+file+"," + target+");");
            /**
            // TODO:
            try
            {
                Files.createDirectories(target.getParent());
                Files.copy(file,target);
            }
            catch (IOException e)
            {
                throw new UncheckedIOException(e);
            }
             */
    });
}

Es ist nie eine gute Idee, Dateien in das Verzeichnis zu generieren, das Sie scannen – da dies bedeutet, dass Sie nicht mit derselben Eingabe erneut ausführen können, da Sie die Anzahl der Dateien verdoppeln.


Beantwortet von –
DuncG


Antwort geprüft von –
Cary Denson (FixError Admin)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like