AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dateiumbennen mit "Sonderzeichen"?

Ein Thema von Sharky · begonnen am 4. Jul 2005 · letzter Beitrag vom 4. Jul 2005
Antwort Antwort
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#1

Dateiumbennen mit "Sonderzeichen"?

  Alt 4. Jul 2005, 12:06
Hai,

ich habe hier einige Files die kroatische Buchstaben im Pfad/Dateinamen haben.
Diese wollte ich jetzt gerne so umbennen das nur noch ASCII-Zeichen vorkommen.

Die Dateinamen sehen z.B. so aus:
Zitat:
C:\Dokumente und Einstellungen\Stephan\Eigene Dateien\Eigene Musik\Fabian\Gradišcani\GRADIŠČANI - Danice, vjeruj mi.mp3
Ich versuche jetzt zum testen mit diesem Code die Datei umzubennen. Leider wird bei Delphi-Referenz durchsuchenRenameFile als Ergebniss immer FALSE zurück gegeben und die Datei auch nicht umbenannt.

Delphi-Quellcode:
var
    oldChar : WideString;
    newChar : WideString;
    oldFile : WideString;
    newFile : WideString;

procedure TForm1.FormCreate(Sender: TObject);
begin
  oldChar := 'Š';
  newChar := 'S';
end;

procedure TForm1.Button1Click(Sender: TObject); // Datei auswählen
begin
  if (OpenDialog1.Execute) then
  begin
    oldFile := OpenDialog1.FileName;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject); // Umbennen
begin
  newFile := StringReplace(oldfile,oldChar,newChar,[rfReplaceAll]);
  if (RenameFile(OldFile,newFile )) then // Dateiumbenennen
  begin
    ShowMessage('Okay');
  end
  else
  begin
    ShowMessage('Fehler');
  end;
end;
Hat einer von euch eine Idee was ich da machen könnte?
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Dateiumbennen mit "Sonderzeichen"?

  Alt 4. Jul 2005, 12:14
Das Č ist nicht in der westeuropäischen Codpage definiert. Und da alle RenameFile nur mit Ansi-Strings arbeitet wird versucht die falsche Datei umzubenennen.

Schau mal in den TntWare-Controls, ob dort schon die entsprechenden Funktionen "Unicodisiert" wurden
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Dateiumbennen mit "Sonderzeichen"?

  Alt 4. Jul 2005, 12:21
Oder versuch explizit CopyFileW zu benutzen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Dateiumbennen mit "Sonderzeichen"?

  Alt 4. Jul 2005, 12:33
Zitat von Bernhard Geyer:
...Schau mal in den TntWare-Controls, ob dort schon die entsprechenden Funktionen "Unicodisiert" wurden
Hai Bernhard,
Du bist mein Held des Tages Jetzt scheint es wunderbar zu gehen.
In deren TntSysUtils ist unteranmderem ein WideRenameFile implementiert.

@Luckie:
Ich fürchte CopyFileW würde auch nicht so einfach gehen. Der Standard-OpenDialog liefert nämlich schon den Filename fehlerhaft zurück.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#5

Re: Dateiumbennen mit "Sonderzeichen"?

  Alt 4. Jul 2005, 12:43
Zitat von Sharky:
Der Standard-OpenDialog liefert nämlich schon den Filename fehlerhaft zurück.
Delphi-Quellcode:
uses
  CommDlg;
Delphi-Quellcode:
var
  OFN: TOpenFilenameW;
  FileName: array[0..MAX_PATH * 2] of WideChar;
  OldChar: WideString;
  NewChar: WideString;
  NewFileName: WideString;
begin

  FillChar(OFN, SizeOf(TOpenFilenameW), 0);
  FillChar(FileName, SizeOf(FileName), 0);

  OFN.lStructSize := SizeOf(TOpenFilenameW);
  OFN.hWndOwner := Handle;
  OFN.hInstance := 0;
  OFN.lpstrFile := @FileName;
  OFN.nMaxFile := MAX_PATH;

  if GetOpenFileNameW(OFN) then
  begin
    OldChar := 'Š';
    NewChar := 'S';
    // StringReplace würde ich nicht benutzen
    // NewFileName := StringReplace(FileName, OldChar, NewChar, [rfReplaceAll]);
    // if not MoveFileW(FileName, PWideChar(NewFileName)) then
    // RaiseLastOSError;
  end;

end;
Ciao, Sprint.

"I don't know what I am doing, but I am sure I am having fun!"
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Dateiumbennen mit "Sonderzeichen"?

  Alt 4. Jul 2005, 12:45
Hai Sprint,

warum denn kein StringReplace?

P.S.: Danke für den Code. Bei den Tnt "Dingern" ist aber sogar ein passender OpenDialog dabei
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Dateiumbennen mit "Sonderzeichen"?

  Alt 4. Jul 2005, 12:59
Zitat von Sharky:
@Luckie:
Ich fürchte CopyFileW würde auch nicht so einfach gehen. Der Standard-OpenDialog liefert nämlich schon den Filename fehlerhaft zurück.
Wenn dir schon der OpenDialog den Dateinamen fehlerhaft zurückliefert, wie kann dann WideRenameFile funktionieren?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
bigg
(Gast)

n/a Beiträge
 
#8

Re: Dateiumbennen mit "Sonderzeichen"?

  Alt 4. Jul 2005, 13:03
Ich habe mir extra dazu eine Funktion geschrieben, die es mir ermöglicht den Dateinamen zu überprüfen:
Wie ich sehe verwendest du Unicode :/

Nun müßte man nur noch den kompletten Pfad überprüfen.

Delphi-Quellcode:
////////////////////////////////////////////////////////////////////////////////
// Dateiname auf Gültigkeit überprüfen
////////////////////////////////////////////////////////////////////////////////

function IsFileName(FileName: String): Boolean;
const ForbiddenChars = ['"', '<', '>', '|', '*', '/', '\', '?']; // verbotene Zeichen
var i: Integer; p: PChar;
begin
  Result := False;

  if FileName <> 'then // Name darf nicht leer sein
  begin
    i := Length(FileName);

    if FileName[i] <> '.then // letze Zeichen darf kein Punkt sein
    begin
      p := Pointer(FileName);

      repeat if p^ in ForbiddenChars then
        Exit;
        inc(p);
      until p^ = #0;

    Result := True;
  end;
  end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: Dateiumbennen mit "Sonderzeichen"?

  Alt 4. Jul 2005, 13:04
Zitat von Luckie:
Wenn dir schon der OpenDialog den Dateinamen fehlerhaft zurückliefert, wie kann dann WideRenameFile funktionieren?
Die TNT-Controls bieten einen Unicode-Enabled OpenDialog an.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Dateiumbennen mit "Sonderzeichen"?

  Alt 4. Jul 2005, 13:06
Zitat von Luckie:
..Wenn dir schon der OpenDialog den Dateinamen fehlerhaft zurückliefert, wie kann dann WideRenameFile funktionieren?
Zitat von Sharky:
... Bei den Tnt "Dingern" ist aber sogar ein passender OpenDialog dabei
Es gibt einen TntOpenDialog. Mit dem geht es. Aber der war eh nur zum testen

Zum Glück wurden in der TntSysUtils auch ein WideFindFirst implementiert.
Mit diesen ganzen Funktionen konnte ich das ganze jetzt recht schnell lösen.

Danke nochmals.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:15 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