Einzelnen Beitrag anzeigen

Benutzerbild von Shivan
Shivan

Registriert seit: 5. Mär 2003
Ort: Ravensburg
131 Beiträge
 
Delphi 6 Enterprise
 
#1

Unicode Dateiname umbenennen um ihn öffnen zu können

  Alt 11. Feb 2006, 19:31
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:
{: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;
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??

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?
Markus Stein
  Mit Zitat antworten Zitat