{:Converts Unicode string to Ansi string using specified code page.
@param ws Unicode string.
@param codePage Code page to be used in conversion.
@returns Converted ansi string.
}
function WideStringToString(
const ws: WideString; codePage: Word): AnsiString;
var
l: integer;
begin
if ws = '
'
then
Result := '
'
else
begin
l := WideCharToMultiByte(codePage,
WC_COMPOSITECHECK
or WC_DISCARDNS
or WC_SEPCHARS
or WC_DEFAULTCHAR,
@ws[1], - 1,
nil, 0,
nil,
nil);
SetLength(Result, l - 1);
if l > 1
then
WideCharToMultiByte(codePage,
WC_COMPOSITECHECK
or WC_DISCARDNS
or WC_SEPCHARS
or WC_DEFAULTCHAR,
@ws[1], - 1, @Result[1], l - 1,
nil,
nil);
end;
end;
{ WideStringToString }
{:Converts Ansi string to Unicode string using specified code page.
@param s Ansi string.
@param codePage Code page to be used in conversion.
@returns Converted wide string.
}
function StringToWideString(
const s: AnsiString; codePage: Word): WideString;
var
l: integer;
begin
if s = '
'
then
Result := '
'
else
begin
l := MultiByteToWideChar(codePage, MB_PRECOMPOSED, PChar(@s[1]), - 1,
nil, 0);
SetLength(Result, l - 1);
if l > 1
then
MultiByteToWideChar(CodePage, MB_PRECOMPOSED, PChar(@s[1]),
- 1, PWideChar(@Result[1]), l - 1);
end;
end;
{ StringToWideString }
procedure TForm1.Button1Click(Sender: TObject);
var
hFind: THandle;
FindFileData: WIN32_FIND_DATAW;
l_FileName: WideString;
l_FileNameStr:
String;
l_NewName: WideString;
l_NewNameStr:
String;
begin
//Dateien suchen
hFind:=FindFirstFileW('
..\Testdateien\*.mp3',FindFileData);
if hFind<>INVALID_HANDLE_VALUE
then begin
repeat
l_FileName := FindFileData.cFileName;
//Konvertieren und Zeichen ersetzen
l_FileNameStr := WideStringToString(l_FileName, CP_ACP);
l_NewNameStr := StringReplace(l_FileNameStr, '
++', '
ü', [rfReplaceAll]);
l_NewNameStr := StringReplace(l_NewNameStr, '
+Â', '
ö', [rfReplaceAll]);
l_NewNameStr := StringReplace(l_NewNameStr, '
+û', '
Ö', [rfReplaceAll]);
l_NewNameStr := StringReplace(l_NewNameStr, '
+ñ', '
ä', [rfReplaceAll]);
l_NewNameStr := StringReplace(l_NewNameStr, '
+ä', '
Ä', [rfReplaceAll]);
l_NewNameStr := StringReplace(l_NewNameStr, '
+ƒ', '
ß', [rfReplaceAll]);
l_NewName := StringToWideString(l_NewNameStr, CP_ACP);
if (l_FileNameStr <> l_NewNameStr)
and
(MessageDlg('
Umbenennen?'+#13+l_FileNameStr+'
-->'+l_NewNameStr, mtConfirmation, [mbYes, mbNo], 0) = mrYes)
then
begin
if not WideFileExists(l_FileName)
then //<-- hier is schonmal das erste Problem -- komischerweise schon beim Originaldateinamen?!? - das gibt nämlich immer FALSE
ShowMessage('
Datei gibts nicht ?!');
if not MoveFileW(PWideChar(l_FileName), PWideChar(l_NewName))
then //<-- und das schlägt ebenfalls fehl
ShowMessage('
Fehler beim Umbenennen!');
end;
until FindNextFileW(hFind,FindFileData) <> true;
end;
end;