Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Dateiumbennen mit "Sonderzeichen"? (https://www.delphipraxis.net/49012-dateiumbennen-mit-sonderzeichen.html)

Sharky 4. Jul 2005 11:06


Dateiumbennen mit "Sonderzeichen"?
 
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?

Bernhard Geyer 4. Jul 2005 11:14

Re: Dateiumbennen mit "Sonderzeichen"?
 
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

Luckie 4. Jul 2005 11:21

Re: Dateiumbennen mit "Sonderzeichen"?
 
Oder versuch explizit CopyFileW zu benutzen.

Sharky 4. Jul 2005 11:33

Re: Dateiumbennen mit "Sonderzeichen"?
 
Zitat:

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.

Sprint 4. Jul 2005 11:43

Re: Dateiumbennen mit "Sonderzeichen"?
 
Zitat:

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;

Sharky 4. Jul 2005 11:45

Re: Dateiumbennen mit "Sonderzeichen"?
 
Hai Sprint,

warum denn kein StringReplace?

P.S.: Danke für den Code. Bei den Tnt "Dingern" ist aber sogar ein passender OpenDialog dabei :-D

Luckie 4. Jul 2005 11:59

Re: Dateiumbennen mit "Sonderzeichen"?
 
Zitat:

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?

bigg 4. Jul 2005 12:03

Re: Dateiumbennen mit "Sonderzeichen"?
 
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;

Bernhard Geyer 4. Jul 2005 12:04

Re: Dateiumbennen mit "Sonderzeichen"?
 
Zitat:

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.

Sharky 4. Jul 2005 12:06

Re: Dateiumbennen mit "Sonderzeichen"?
 
Zitat:

Zitat von Luckie
..Wenn dir schon der OpenDialog den Dateinamen fehlerhaft zurückliefert, wie kann dann WideRenameFile funktionieren?

Zitat:

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:14 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