![]() |
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:
![]()
Delphi-Quellcode:
Hat einer von euch eine Idee was ich da machen könnte?
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; |
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 ![]() |
Re: Dateiumbennen mit "Sonderzeichen"?
Oder versuch explizit CopyFileW zu benutzen.
|
Re: Dateiumbennen mit "Sonderzeichen"?
Zitat:
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. |
Re: Dateiumbennen mit "Sonderzeichen"?
Zitat:
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; |
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 |
Re: Dateiumbennen mit "Sonderzeichen"?
Zitat:
|
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; |
Re: Dateiumbennen mit "Sonderzeichen"?
Zitat:
|
Re: Dateiumbennen mit "Sonderzeichen"?
Zitat:
Zitat:
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 22:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz