![]() |
Unicode Dateiname umbenennen um ihn öffnen zu können
Hallo,
ich habe bei mir aufgrund Zeichensatzproblemen beim Kopieren von Dateien (von XFS nach NTFS) bei allen Umlauten/Sonderzeichen Unicode-Chars erhalten. Die Datei lässt sich jedoch aufgrund der speziellen Sonderzeichen über Delphi native Mittel nicht öffnen/umbenennen oder sonstiges. Deswegen versuche ich über WinAPI Funktionen die Datei entsprechend in einen lesbaren Dateinamen zu konvertieren. Eine Datei sieht beispielsweise so aus: ├û La Pal├Âma Boys - G├Â, Tell It On The Mountain.mp3 ├û --> Ö ├ --> ö usw. Ich habe es bisher hiermit versucht:
Delphi-Quellcode:
WideStringReplace von den Tnt-Komponenten hat auch nicht so ganz funktioniert wie es hätte sollen, obwohl ich mir den Speicherauszug also die 2 Bytes in der Originaldatei angeschaut hab und dann mittels #$C1#$25 die Zeichen zusammenbaute. Ich glaube irgendwie, dass es mit Delphi 6 wohl sehr umständlich ist, mit Unicode-Zeichen umzugehen??
{: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; Im Internet habe ich auch kaum was dazu gefunden, ausser das, was ich bisher umgesetzt habe, da sich die meisten nur mit Unicode-Dateiinhalt beschäftigen, anstatt mit Unicode-Dateinamen. Vielleicht hat ja hier jemand noch eine Idee? |
Re: Unicode Dateiname umbenennen um ihn öffnen zu können
Moin moin,
Delphi-Quellcode:
Versuch doch mal den Vollen Pfad zu der Datei zu übergeben und nicht nur den Namen, dann wird die Datei
WideFileExists(l_FileName)
auch existieren. Bei MoveFileW auch den Pfad mit angeben... |
Re: Unicode Dateiname umbenennen um ihn öffnen zu können
Danke!!!!
Oh mann da hätt ich aber echt können selbst drauf kommen. Kaum gibt man den vollen Namen an, gehts auch ;) |
Re: Unicode Dateiname umbenennen um ihn öffnen zu können
Zitat:
Tipp für's nexte Mal: Den Mount-Parameter utf8 beim Mounten des NTFS-Volumes dranhängen. Klappt auch wunderbar um lesend seinen alten Krempel von NTFS auf ein richtiges[tm] Dateisystem zu bringen, wenn man von Windows nach Linux migriert. Mir sind damals bei meinen Dateien (es war wie bei dir auch Musik dabei, allerdings Ogg-Streams ;-)) ein paar nonASCII-Zeichen verloren gegangen, beim zweiten Kopieranlauf mit utf8-gemountetem Volume lief's dann. |
Re: Unicode Dateiname umbenennen um ihn öffnen zu können
Zitat:
Oder gibts ein XFS-Treiber für XP ?? Bisher hab ich nur welche für ext2/ext3 entdeckt... Weil XFS war schon richtig flott im Dateien auflisten usw... im Vergleich zu NTFS. |
Re: Unicode Dateiname umbenennen um ihn öffnen zu können
Zitat:
Wäre jedenfalls schade um die Kiste, denn an einem halbwegs aktuellen Windows(NT) wirst du bei dem Speicherausbau auch nur dann deine Freude haben, wenn du masochistisch veranlagt bist ;-) Zitat:
Zitat:
|
Re: Unicode Dateiname umbenennen um ihn öffnen zu können
Zitat:
1) In welche Unit steht die Funktion: MultiByteToWideChar 2) Woher weiß ich, welchen Wert ich für die Codepage übergeben muss...Also angenommen der Zeichensatz ist Win1252..welcher Wert ist das und wo steht das? Danke, Martin PS: Und wo ist MB_PRECOMPOSED definiert. Find das nirgendwo; bin zu doof :cry: |
Re: Unicode Dateiname umbenennen um ihn öffnen zu können
Moin moin,
Zitat:
Zitat:
der cp 850 den Platz 225, in der cp 1252 dagegen den Platz 223. Bei Win1252 ist es dei Codepage 1252 :-) |
Re: Unicode Dateiname umbenennen um ihn öffnen zu können
Ich würde die Dateinamen garnicht umbenennen ... man braucht sich doch nur den 8.3-Dateinamen besorgen, dieser ist nicht in Unicode gehalten und man kann über ihn direkt auf eine Datei mit UnicodeZeichen im Namen zugreifen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:23 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 by Thomas Breitkreuz