Dateinamen mit führenden Nullen nummerieren (Java-Tool für Windows)

Published by Philipp Schuster on

Update 03. Februar 2023

Ich habe die Funktionalität neu als Rust-Utility auf crates.io veröffentlicht.

Update 15. Januar 2015

Habe nun versucht die Software modular zu gestalten. Da ich keine Erfahrung mit “richtigen” Java-Anwendungen habe, kann ich es leider nicht richtig einschätzen, aber – es funktioniert! Das Projekt ist nun auch bei GitHub.

Windows nummeriert fortlaufende Dateinamen leider ohne führende Nullen. Manche Programme können dadurch die Dateien nicht richtig ordnen (zum Beispiel Google Drive) und außerdem sind so nicht alle Dateinamen einer Gruppe gleich lang. Mein kleines Java-Kommandozeilen-Tool ergänzt bei den kleinen Nummer (1, 2, 3, …) entsprechend viele Nullen, so dass alle Dateinamen gleich lang sind. Die zwei folgenden Grafiken zeigen das.

Windows-NummerierungNummerierung mit führenden Nullen (Java-Tool)
Nummerierung von Windows ohne führenden Nullen

Nummerierung von Windows ohne führenden Nullen

Nummerierung von meinem Java-Tool mit führenden Nullen

Nummerierung von meinem Java-Tool mit führenden Nullen

Das Ganze könnt ihr euch am besten in einem kurzen Video (1:30 / 8,35mb) anschauen. Einfach auf den Play-Button klicken. Bei Problemen bitte hier klicken.

Im Video ist zu sehen, wie Windows fortlaufende Dateinamen ohne führende Nullen nummeriert. Dieses Tool ergänzt so viele Nullen wie nötig. Zudem kann es auch überflüssige Nullen entfernen.

Benutzung

Das Tool über die Kommandozeile mit java -jar Numbered_File_Names_With_Leading_Zeros.jar aufrufen oder alternativ start.bat ausführen. Den Anweisungen auf dem Bildschirm dann Folge leisten. Kann natürlich nicht versprechen, dass es in eurem speziellen Anwendungsfall klappt, wäre aber natürlich sehr toll! Macht in jedem Fall zuvor eine Sicherheitskopie von dem Verzeichnis, das bearbeitet wird! Ich übernehme natürlich keine Haftung für entstandene Schäden.

Download

Chrome und möglicherweise auch Anti-Viren-Software erkennen darin einen “ungewöhnlichen Download”. Wenn jemand weiß, wie ich das beheben kann, dann sagt mir bitte bescheid. Ich habe ja schließlich keinen Virus in der Datei.

In der ZIP-Datei (8,10mb) enthaltene Dateien:

  • Java-Tool Dateinamen mit führenden Nullen nummerieren.mp4
  • Numbered_File_Names_With_Leading_Zeros.jar
  • Nummerierung Java-Tool mit führenden Nullen.png
  • Nummerierung Windows ohne führenden Nullen.png
  • start.bat

Quellcode

package de.phip1611.apps.numbered_filenames_with_leading_zeros;

import java.io.File;
import java.util.Arrays;
import java.util.Scanner;

public class NumberedFileNames {
    /**
     * Erlaubt:
     * <ul>
     * <li>Urlaub Mallorca (123).jpg</li>
     * <li>Urlaub_Mallorca_(123).jpg</li>
     * <li>Urlaub-Mallorca-(123).jpg</li>
     * <li>(Mischformen)</li>
     * </ul>
     */
    public final String DEFAULT_FILENAME_PATTERN = "([\\w\\s\\-]+)\\((\\d+)\\)\\.(\\w+)";
    /**
     * Trennzeichen, hinter dem die Dateinamennummer steht
     */
    public final String DEFAULT_DELIMITER = "(";
    
    private String  directoryPath;
    private File    directory;
    private File[]  files;
    private String  filenamePattern;
    private String  delimiter;
    private String  delimiterClose;
    private int     digits;
    private Scanner scanner;
    
    public static void main(String[] args) {
        new NumberedFileNames().run();
    }
    
    public void run() {
        showHelp();
        scanner = new Scanner(System.in);
        askForDirectory();
        askForFilenamePattern();
        openDiretory();
        showExampleFiles();
        askForConfirmation();
        askForDelimiter();
        lookForHighestFilenameCountNamer();
        renameFiles();
    }
    
    public static void showHelp() {
        System.out.println("--- Hilfe zum Tool NumberedFileNames ---");
        System.out.println("Windows nummeriert fortlaufende Dateienamen\n\rmit dem Muster 1, 2, .., 11, .., 121");
        System.out.println("Dieses Programm ergaenzt die Nummern mit\n\rfuehrenden Nullen: 001, 002, .., 011, .., 121");
        System.out.println("Die Nummer muss in Klammern stehen: Bild_(1).jpg --> Bild_(001).jpg");
        System.out.println("--- -------------------------------- ---");
    }
    
    private void askForDirectory() {
        do {
            System.out.println("Absoluten Verzeichnis-Pfad eingeben:");
            directoryPath = scanner.nextLine();
            directory = new File(directoryPath);
        } while(!directory.isDirectory());
    }
    
    private void askForDelimiter() {
        String input;
        System.out.println("--- -------------------------------- ---");
        System.out.println("Trennzeichen hinter dem die Zahl steht?");
        System.out.println("Moeglichkeiten: \"(\", \"[\", \"{\", \"<\"");
        System.out.println("Standard: \"(\"");
        
        input = scanner.nextLine();
        switch (input) {
            case "[":
                delimiter = "\\[";
                delimiterClose = "\\]";
                break;
            case "{":
                delimiter = "\\{";
                delimiterClose = "\\}";
                break;
            case "<":
                delimiter = "\\<";
                delimiterClose = "\\>";
                break;
            default:
                delimiter = "\\"+DEFAULT_DELIMITER;
                delimiterClose = "\\)";
                break;
        }
    }
    
    private void askForFilenamePattern() {
        String input;
        System.out.println("--- -------------------------------- ---");
        System.out.println("Benutzerdefiniertes Muster fuer Dateien benutzen?");
        System.out.println("(Regulaerer Ausdruck)");
        System.out.println("Standard ist "+DEFAULT_FILENAME_PATTERN+" und schliesst folgende Faelle ein:");
        System.out.println("Urlaub Mallorca (123).jpg");
        System.out.println("Urlaub_Mallorca_(123).jpg");
        System.out.println("Urlaub-Mallorca-(123).jpg");
        System.out.println("(Mischformen)");
        System.out.println("---");
        System.out.println("Fuer Standard einfach \"-\" eingeben oder leer lassen!");
        
        System.out.println("Regulaeren Ausdruck fuer Dateien eingeben:");
        input = scanner.nextLine();
        if (input.equals("-") || input.equals("")) {
            filenamePattern = DEFAULT_FILENAME_PATTERN;
        } else {
            filenamePattern = input;
        }
    }
    
    private void askForConfirmation() {
        String input;
        System.out.println("--- -------------------------------- ---");
        System.out.println("Lege sicherheitshalber eine Kopie des Ordners an!");
        System.out.println("Wirklich fortfahren? \"ja\" eingeben!");
        input = scanner.nextLine();
        if (!input.toLowerCase().equals("ja")) {
            System.exit(0);
        }
    }
    
    private void openDiretory() {
        files = directory.listFiles();
    }
    
    private void showExampleFiles() {
        System.out.println("--- -------------------------------- ---");
        System.out.println("(Bis zu) drei Beispiel-Dateien aus dem Verzeichnis,");
        System.out.println("die mit dem Muster übereinstimmen:");
        for (int i=0;i<files.length;i++) {
            if (files[i].getName().matches(filenamePattern)) {
                System.out.println(files[i].getName());
            }
            if (i>2) {
                break;
            }
        }
    }
    
    private void lookForHighestFilenameCountNamer() {
        int count, highestCount;
        count = 0;
        highestCount = 0;
        for (File tmp : files) {
            if (tmp.getName().matches(filenamePattern)) {
                count = Integer.valueOf(tmp.getName().split(delimiter)[1].split(delimiterClose)[0]);
                if (count > highestCount) {
                    highestCount = count;
                }
            }
        }
        digits = String.valueOf(highestCount).length();
    }
    
    private void renameFiles() {
        int count, countDigits, digitsDifference;
        count = countDigits = digitsDifference = 0;
        String completeNewFilePath, filenameBeforeDelimiter, filenameAfterDelimiter, sCount;
        for (File tmp : files) {
            if (tmp.getName().matches(filenamePattern)) {
                filenameBeforeDelimiter = tmp.getName().split(delimiter)[0];
                filenameAfterDelimiter  = tmp.getName().split(delimiterClose)[1];
                completeNewFilePath = tmp.getAbsolutePath().replace(tmp.getName(), "");
                completeNewFilePath = completeNewFilePath+filenameBeforeDelimiter;
                
                sCount = tmp.getName().split(delimiter)[1].split(delimiterClose)[0];
                count = Integer.valueOf(sCount);
                
                // Bereits vorhandene führende nullen entfernen
                sCount = String.valueOf(count);
                countDigits = String.valueOf(count).length();
                digitsDifference = digits - countDigits;
                for (int i=0;i<digitsDifference;i++) {
                    sCount = "0"+sCount;
                }
                completeNewFilePath = completeNewFilePath +
                        delimiter.replace("\\", "") +
                        sCount +
                        delimiterClose.replace("\\", "") +
                        filenameAfterDelimiter;
                tmp.renameTo(new File(completeNewFilePath));
            }
        }
    }   
}

Philipp Schuster

Hi, I'm Philipp and interested in Computer Science. I especially like low level development, making ugly things nice, and de-mystify "low level magic".

0 Comments

Leave a Reply

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