Registriert seit: 11. Apr 2009
557 Beiträge
Delphi 12 Athens
|
Algorithmus für Datei-Umbenennen?
13. Feb 2016, 17:59
Ich stehe vor dem Problem, Dateien in einem Verzeichnis umzubenennen und dabei das Problem von Dateinamenkollisionen möglichst effizient zu lösen.
Es wird ein Grund-Dateiname erstellt und eine fortlaufende Zahl in frei konfigurierbarer Weise (Position, Stellen, Startzahl, Vornullen) eingefügt. Anzahl und Auswahl der umzubenennenden Dateien können völlig variieren. Die umbenannten Dateien bilden dann einen homogenen Block mit gleichem Grundnamen und fortlaufender Nummer. Also in etwa das, was die zahlreichen Datei-Umbenenner so machen, mit dem Unterschied, dass es sein kann, dass eine Datei innerhalb des Blocks auf eine neue Position soll. Dann sollen die Dateinamen innerhalb des Blocks entsprechend angepasst werden.
Ich habe nicht den Überblick über die ganze Programmvielfalt, aber die Umbenenner, die ich kenne, machen es sich einfach und stellen bei Kollisionen schlicht die Arbeit ein. Das geht besser.
Mein bisheriger Ansatz:
Alle Dateinamen sind in einer TObjectList<TDateiInfo>. TDateiInfo ist eine Klasse mit einer Reihe Feldern, von denen hier nur "Dateiname" und "DateinameNeu" interessant sind. Die ObjectList verfügt über die notwendigen Funktionen zum Sortieren, Vergleichen und BinarySearch.
Von der ObjectList werden zwei weitere Instanzen erzeugt. In die eine kommen alle Dateien außerhalb des Blocks, in die andere die umzubenennenden, wobei in "DateinameNeu" dann auch gleich der neue Dateiname gespeichert wird. Bei jedem neuen Dateinamen wird in beiden Listen gesucht, ob der entsprechende Name schon vorhanden ist. Ist dies in der "Außenliste" der Fall, wird abgebrochen, da dieser Zustand nicht reparierbar ist. Gibt es auch "intern" keine Duplikate, dann ist die Sache einfach, es wird einfach ruckizucki durchbenannt.
Natürlich geht es hier nur um den zweiten Fall. Klar ist, dass es Kombinationen gibt, wo die Vergabe eines temporären Dateinamens unumgänglich ist. Und genau das will ich durch "intelligentes" Umbenennen auf das unvermeidbare Maß (am besten natürlich Null) drücken.
Und das ist letztlich meine Frage: Gibt es für sowas einen schlauen Algorithmus?
|