Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Dateiname: Ersetzen/Löschen von Teilstrings (https://www.delphipraxis.net/134883-dateiname-ersetzen-loeschen-von-teilstrings.html)

Delphi_gn7 31. Mai 2009 15:56


Dateiname: Ersetzen/Löschen von Teilstrings
 
Hi,

Ich suche ein Programm, mit dem man die Dateinamen von (in meinem Fall) Musikdateien massenhaft bearbeiten kann, sodass unnötige Zeichen wie Unterstriche antfernt/durch anderes ersetzt werden.
z.B.

aus "101_michael_mind_-_ride_like_the_wind.mp3" wird "michael mind - ride like the wind.mp3"

Ich habe etwa 10 Monate Delphi Erfahrung und habe mir mithilfe einer Prozedur, die ich unter http://www.delphi-library.de/topic_n...chen_1107.html gefunden habe, ein Programm dafür zusammengebastelt. Da ich also nicht alles selber geschrieben habe kam es natürlich zu Komplikationen.

Frage: Kann man kleine Verbesserungen an dem Programm vornehmen, sodass es funktioniert, oder sollte ich lieber vorerst die Finger davon lassen, bis ich es selbst verstehe?
In dem Fall würde ich trotzdem gerne wissen ob es bereits ein Programm gibt, das mein Problem löst.

Delphi-Quellcode:
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

function lastSlash(path: string):string;
var
hilfStr: string;
slashPos: integer;
begin
hilfStr:=path;
while (pos('\',hilfStr) > 0) do
hilfStr:=copy(hilfStr,slashPos+1,length(hilfStr)-slashPos);
result:=hilfStr;
end;

procedure RenameFiles (var datei: string; Ren, RenIn: string);
Var
  FindRec: tSearchRec;
  DateiName: string;
Begin
 If (datei = '') Then Exit;

  If FindFirst (datei, faAnyFile, FindRec) <> 0
  Then Repeat
       If (FindRec.Name <> '.') and (FindRec.Name <> '..')
       Then begin
            DateiName:=datei+FindRec.Name;
            if (pos(Ren,DateiName) > 0)
            then begin
                 insert(RenIn,DateiName,(pos(Ren,DateiName)));
                 delete(DateiName,pos(Ren,DateiName),length(Ren));
                 RenameFile(datei,lastSlash(datei)+DateiName);
                 end

            else writeln('Teilstring nicht gefunden');
            end;
       Until FindNext (FindRec) <> 0;

  FindClose (FindRec);



end;




var
  dir, Ren, RenIn, datei,namestring: string;

begin
write('Ordner (mit Backslash): ');
readln(dir);
namestring:=lastSlash(dir);
write('Umzubenennender Teilstring: ');
readln(Ren);
write('Zu ersetzen durch: ');
readln(RenIn);
RenameFiles (dir,Ren,RenIn);
readln;
end.

Anonymos 31. Mai 2009 16:10

Re: Dateiname: Ersetzen/Löschen von Teilstrings
 
Moin,

Also erstmal wäre es nett, wenn du mal beschreibe würdest wo dein Fehler überhaupt liegt.
Soweit ich des grad übersehen hab wird "lastslash" schonmal überhauptnicht verwendet

Weiter rate ich jetz einfach mal, das das problem beim Umbenennen liegt:
soll heißen, die Dateien werden umbenannt, aber falsch

In diesem Fall schau dir nochmal die Funktionsweise von Insert und Delete an
(Du Deletest an der gleichen Stelle, an der du vorher eingefügt hast)

Um dir die Funktionsweise ein bisschen darzustellen:
Die Funktion FindFirst sucht solange nach Dateinamen in dem angegebenen Verzeichnis, bis FindNext nichts mehr findet.
Man kann sich das ganze wie beim lesen einer Datei vorstellen, die man liest, bis EOF das Dateiende angibt.

mfg

Delphi_gn7 31. Mai 2009 16:46

Re: Dateiname: Ersetzen/Löschen von Teilstrings
 
lastSlash wird bei RenameFile verwendet

vorher wird erst der neue, ersetzende Teilstring "renIn" eingesetzt, womit ja der Rest des Strings verschoben wird (oder habe ich die insert Prozedur falsch interpretiert und sie erhöht die Länge des Strings gar nicht...??), somit ändert sich auch die Position von "Ren", das dann gelöscht wird.

Wenn ich zuerst "Ren" löschen würde, wüsste ich ja nicht mehr an welcher Stelle "RenIn" eingefügt werden soll, ohne das ich eine Hilfsvariable benutze, die die Position speichert.

Zum Programmfehler: Das Programm lief, veränderte aber rein gar nichts an meinen Dateinamen.

Namenloser 31. Mai 2009 16:48

Re: Dateiname: Ersetzen/Löschen von Teilstrings
 
Total Commander (übrigens auch sonst zu empfehlen)

Delphi_gn7 31. Mai 2009 16:51

Re: Dateiname: Ersetzen/Löschen von Teilstrings
 
Habe nochmal die Prozedur insert nachgeschlagen... sie macht das, was ich auch erwartet habe... eine Prozedur, die beim Einfügen des Teilstrings die schon an dieser Stelle vorhandenen zeichen dabei löscht (wobei also die Länge des String gleich bleibt), gibt es auch, sei heißt "StringReplace"
(http://www.delphi-treff.de/no_cache/...f8f&sword_list[0]=stringverarbeitung)

Anonymos 31. Mai 2009 16:55

Re: Dateiname: Ersetzen/Löschen von Teilstrings
 
ok, sorry
da hast du recht
Du bestimmst die Position von Ren ja nochmals neu

Die Variable "datei" in RenameFiles enthält nur den OrdnerPfad (?)
Und so eine Datei kannst du nicht umbenennen
geb bei RenameFile mal den ganzen Dateinamen an
Delphi-Quellcode:
RenameFile(datei+FindRec.Name,datei+DateiName);
//         alter Dateiname  | neuer Dateiname

Delphi_gn7 31. Mai 2009 17:41

Re: Dateiname: Ersetzen/Löschen von Teilstrings
 
Oh stimmt

dann wird die Funktion LastSlash (die von einem Pfad + Dateinamen den Pfad wegschneidet, sodass der Dateiname übrigbleibt) ja sogar überflüssig. :)
habe auch durch einen Hinweis von Delphi festgestellt, das die Variable Slashpos in dieser Funktion gar nicht initialisiert wurde... hab sie mal gestrichen und sie durch das längere "pos('\',hilfStr)" ersetzt.

trotzdem funktioniert es so nicht, ich blocke auch gar nicht mehr so gut durch wegen den vielen Variablen....

Delphi_gn7 31. Mai 2009 18:09

Re: Dateiname: Ersetzen/Löschen von Teilstrings
 
Zitat:

Zitat von NamenLozer
Total Commander (übrigens auch sonst zu empfehlen)

Danke für den Tipp!
Kannst du mir sagen, ob/wie man Leerzeichen ENTFERNEN kann?

der_hugo 31. Mai 2009 18:14

Re: Dateiname: Ersetzen/Löschen von Teilstrings
 
Hallo,

evtl. hilft dir hier mein Programm RenamePack

Viele Grüße :thumb:

der_hugo

himitsu 31. Mai 2009 18:23

Re: Dateiname: Ersetzen/Löschen von Teilstrings
 
Dein insert und rename ersetzt immer nur das erste Vorkommen des gesuchen Strings/Zeichens.

Für alle Vorkommen müßtest du es in einer Schleife solange wiederholen, bis der String/das Zeichen nicht mehr vorkommt.

Aber zum Ersetzen würde ich dir Delphi-Referenz durchsuchenStringReplace empfehlen.


Dann macht es sich besser erstmal alle (nötigen) Dateien in eine Liste aufzunehmen und anzuzeigen, so daß man da nochmal schnell drüberschauen und eventuell noch was ändern kann, bevor umbenannt wird.



PS: du läßt doch dein Programm erstmal nur über ein Testverzeichnis laufen, bzw. hast dir von den Dateien ein Backup gemacht?

Steku 31. Mai 2009 18:30

Re: Dateiname: Ersetzen/Löschen von Teilstrings
 
Und noch ein Freeware Tool...

Bulk Rename Utility

Gruß,
Steku

Delphi_gn7 31. Mai 2009 19:06

Re: Dateiname: Ersetzen/Löschen von Teilstrings
 
Zitat:

Zitat von himitsu
Für alle Vorkommen müßtest du es in einer Schleife solange wiederholen[...].

Ok hab ich eingebaut.

Zitat:

Zitat von himitsu
Aber zum Ersetzen würde ich dir Delphi-Referenz durchsuchenStringReplace empfehlen.

Warum denn?


Zitat:

Zitat von himitsu
Dann macht es sich besser erstmal alle (nötigen) Dateien in eine Liste aufzunehmen und anzuzeigen, so daß man da nochmal schnell drüberschauen und eventuell noch was ändern kann, bevor umbenannt wird.

Dazu komme ich wenn überhaupt erst, wenn es überhaupt mal funktioniert :)


Zitat:

Zitat von himitsu
PS: du läßt doch dein Programm erstmal nur über ein Testverzeichnis laufen, bzw. hast dir von den Dateien ein Backup gemacht?

ja, bisher hab ich es nur mit leeren Textdateien versucht

himitsu 31. Mai 2009 19:26

Re: Dateiname: Ersetzen/Löschen von Teilstrings
 
Zitat:

Zitat von Delphi_gn7
Warum denn?

ist ja kein Muß, aber ein Befehl einmal ausgeführt und alles ist ersetzt :angel:
Delphi-Quellcode:
DateiName := StringReplace(DateiName, Ren, RenIn, [rfReplaceAll]);
in der CodeLib ist sogar (glaub ich) irgendwo eine Version, welcher man mehrere Zeichen/Strings übergibt und wo die alle auf einmal ersetzt werden.

Zitat:

Zitat von Delphi_gn7
ja, bisher hab ich es nur mit leeren Textdateien versucht

die Art der Dateien und deren Inhalt ist ja egal ... es wär nur etwas blöd, wenn man sowas auf "wichtige" Dateien losläßt und danach dann alle/viele Dateiname "unbrauchbar"/unverständlich wären :angel2:

Delphi_gn7 31. Mai 2009 19:31

Re: Dateiname: Ersetzen/Löschen von Teilstrings
 
Ach jetzt hab ich das verstanden mit dem Stringreplace :)
Aber was bedeutet das [rfReplaceAll] ?

Und weißt du nicht vielleicht auch warum das Programm immer noch nicht funktioniert (ich kann es mit den Änderungen nochmal posten falls nötig)?

mkinzler 31. Mai 2009 19:47

Re: Dateiname: Ersetzen/Löschen von Teilstrings
 
Zitat:

Aber was bedeutet das [rfReplaceAll] ?
Es werden dann alle Vorkommen des Suxhstrings ersetzt.

himitsu 31. Mai 2009 19:52

Re: Dateiname: Ersetzen/Löschen von Teilstrings
 
siehe Delphi-Referenz durchsuchenStringReplace
Die Delphi-OH
Beschreibung
TReplaceFlags besteht aus einer Menge von Flags, die steuern, wie ein Teilstring innerhalb eines Strings gesucht und ersetzt wird. Diese Menge kann folgende Werte enthalten:

rfReplaceAll Alle Fundstellen werden ersetzt. Wenn dieses Flag nicht vorhanden ist, wird nur die erste Fundstelle des gesuchten Teilstrings ersetzt.
rfIgnoreCase Bei der Suche nach dem Teilstring wird die Groß-/Kleinschreibung nicht berücksichtigt. Wenn dieses Flag nicht vorhanden ist, werden nur Fundstellen berücksichtigt, deren Schreibweise genau mit dem Suchstring übereinstimmt.


PS:
Delphi-Quellcode:
write('Ordner (mit Backslash): ');
das "mit Backslash" kannst weglassen
Delphi-Quellcode:
dir := IncludeTrailingBackslash(dir);
hängt das \ notfalls an ... siehe Delphi-Referenz durchsuchenIncludeTrailingBackslash

für lastSlash gibt es Delphi-Referenz durchsuchenExtractFileName

FindFirst sucht übrigens so auch Verzeichnisse, welche dann ebenfalls umbenannt würden.

ja und namestring wird nie verwendet

der Fehler liegt hier
Delphi-Quellcode:
RenameFile(datei,lastSlash(datei)+DateiName);
lastSlash(datei) liefert kein Verzeichnis und datei ist nicht die gefundene Datei.
und bei der suche würde ich zumindestens eine Suchmaske mit angeben ... damit auch was gefunden wird
Delphi-Quellcode:
datei := IncludeTrailingBackslash(datei);
If FindFirst (datei + '*.*', faAnyFile, FindRec) <> 0
Then Repeat
     If (FindRec.Name <> '.') and (FindRec.Name <> '..')
     Then begin
          DateiName := FindRec.Name;
          if (pos(Ren,DateiName) > 0)
          Then begin
               DateiName := StringReplace(DateiName, Ren, RenIn, [rfReplaceAll]);
               RenameFile(datei + FindRec.Name, datei + DateiName);
          end

// PS: den Variablennamen "datei" besser in "verzeichnis" umbenennen

juergen 31. Mai 2009 20:15

Re: Dateiname: Ersetzen/Löschen von Teilstrings
 
Hallo Delphi_gn7,

Mp3's umbenennen habe ich hinter mir.
Wie NamenLozer im Thread #4 schon geschrieben hat ist Total Commander hier eine gute Wahl.

Zu deiner Frage wie man z.B. Leerzeichen mit dem Total Commander entfernt:
Du markierts alle gewünschten Dateien, drückst dann Strg + M und trägst oben rechts ein Leerzeichen ein (im Feld Suchen&ersetzen).
In der Vorschau siehst du sofort das Ergebnis.
Um das Ganze auch anzuwenden, drückst du unten rechts auf "Start".
Abschließend auf den "gebogenen" Pfeil neben "Start" um weiter zu machen. Das war's.

Wenn dein Hauptziel ein schnelles Umbenennen deiner MP3's ist, wäre es besser dir mal den Total Commander etwas näher anzuschauen. Er bietet wirklich einige Möglichkeiten, ist schnell, einfach zu bedienen und funktioniert.
Solltes du aber deine Anforderung als Anlass nehmen um in Delphi etwas zu lernen, wäre dieser Weg auch in Ordnung, kostet aber natürlich "etwas" mehr Zeit. :mrgreen:

Delphi_gn7 3. Jun 2009 16:56

Re: Dateiname: Ersetzen/Löschen von Teilstrings
 
Vielen Dank für die hilfreichen Tipps, ich werde sie veruschen anzuwenden!

Mfgn7 ;)

Delphi_gn7 9. Jun 2009 17:34

Re: Dateiname: Ersetzen/Löschen von Teilstrings
 
Ich habe (hoffe ich) alle Änderungen eingebracht, aber es tut sich noch immer nichts:

Delphi-Quellcode:
program FileRenamer;

{$APPTYPE CONSOLE}

uses
  SysUtils;

procedure RenameFiles (var datei: string; Ren, RenIn: string);
Var
  FindRec: tSearchRec;
  DateiName: string;
Begin
datei:=IncludeTrailingBackslash(datei);
 If FindFirst (datei + '*.*', faAnyFile, FindRec) <> 0
Then Repeat
     If (FindRec.Name <> '.') and (FindRec.Name <> '..')
     Then begin
          DateiName := FindRec.Name;
          if (pos(Ren,DateiName) > 0)
          Then begin
               DateiName := StringReplace(DateiName, Ren, RenIn, [rfReplaceAll]);
               RenameFile(datei + FindRec.Name, datei + DateiName);
                 end;
            end;

        Until FindNext (FindRec) <> 0;
FindClose (FindRec);
end; // Ende Prozedur

var
  dir, Ren, RenIn: string;

begin
  write('Ordner: ');
  readln(dir);
dir:=IncludeTrailingBackslash(dir);
dir:=ExtractFileName(dir);
  write('Umzubenennender Teilstring: ');
  readln(Ren);
  write('Zu ersetzen durch: ');
readln(RenIn);
RenameFiles (dir,Ren,RenIn);
end.
Mfgn7...


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz