AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Unicode Dateiname umbenennen um ihn öffnen zu können
Thema durchsuchen
Ansicht
Themen-Optionen

Unicode Dateiname umbenennen um ihn öffnen zu können

Ein Thema von Shivan · begonnen am 11. Feb 2006 · letzter Beitrag vom 21. Jun 2006
Antwort Antwort
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
Benutzerbild von x000x
x000x

Registriert seit: 21. Jan 2004
Ort: Bei Hamburg
308 Beiträge
 
Delphi XE2 Professional
 
#2

Re: Unicode Dateiname umbenennen um ihn öffnen zu können

  Alt 11. Feb 2006, 20:14
Moin moin,
WideFileExists(l_FileName) Versuch doch mal den Vollen Pfad zu der Datei zu übergeben und nicht nur den Namen, dann wird die Datei
auch existieren.
Bei MoveFileW auch den Pfad mit angeben...
Peter
-= Gruss Peter =-
-= alias x000x =-
  Mit Zitat antworten Zitat
Benutzerbild von Shivan
Shivan

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

Re: Unicode Dateiname umbenennen um ihn öffnen zu können

  Alt 11. Feb 2006, 20:19
Danke!!!!

Oh mann da hätt ich aber echt können selbst drauf kommen.
Kaum gibt man den vollen Namen an, gehts auch
Markus Stein
  Mit Zitat antworten Zitat
tommie-lie
(Gast)

n/a Beiträge
 
#4

Re: Unicode Dateiname umbenennen um ihn öffnen zu können

  Alt 11. Feb 2006, 20:29
Zitat von Shivan:
ich habe bei mir aufgrund Zeichensatzproblemen beim Kopieren von Dateien (von XFS nach NTFS) bei allen Umlauten/Sonderzeichen Unicode-Chars erhalten.
Unter Linux schreibenderweise ein NTFS-Volume mounten? Mutig, mutig...
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.
  Mit Zitat antworten Zitat
Benutzerbild von Shivan
Shivan

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

Re: Unicode Dateiname umbenennen um ihn öffnen zu können

  Alt 11. Feb 2006, 20:36
Zitat von tommie-lie:
Unter Linux schreibenderweise ein NTFS-Volume mounten? Mutig, mutig...
Nene... die ursprüngliche Partition war XFS. Nur läuft die Linux-Kiste leider nicht mehr mit 64MB Ram... hat sich wohl zu arg an die vorherigen 768MB gewöhnt... somit hab ich via Knoppix gebootet und windows XP Freigabe via Samba gemountet und alles schön brav via cp auf das gemountete SMB rüberkopiert. Leider hat aber da wohl irgendwas nicht gestimmt. Naja jetz muss ich eben die Sachen umbenennen.

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.
Markus Stein
  Mit Zitat antworten Zitat
tommie-lie
(Gast)

n/a Beiträge
 
#6

Re: Unicode Dateiname umbenennen um ihn öffnen zu können

  Alt 11. Feb 2006, 20:50
Zitat von Shivan:
Nur läuft die Linux-Kiste leider nicht mehr mit 64MB Ram...
Hm, sollte noch gehen, allerdings wohl nicht mehr mit den aktuellsten DEs, es sei denn man hat Lust lange auf das Paging zu warten. Vielleicht kriegst du's zum Laufen, wenn du erstmal nur in ein nicht-grafisches Single-User Runlevel bootest (einige Distributionen bieten da sowas wie einen "Recovery Mode" oder "Failsafe" im Bootmanager an, das wäre zumindest mal ein Anfang, auch wenn dann wohl die Volumes read-only gemountet sein dürften) und anschließend Schritt für Schritt die passenden Dienste lädtst und entsprechend auf KDE verzichtest (fvwm oder icewm sollten aber funktionieren, auch wenn die nicht so schick aussehen. Vielleicht läuft auch Enlightenment).
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 von Shivan:
somit hab ich via Knoppix gebootet und windows XP Freigabe via Samba gemountet und alles schön brav via cp auf das gemountete SMB rüberkopiert.
Hm, ja, unter Samba habe ich auch schon ähnliches gesehen, allerdings Linux->Linux, also ohne Windows-Rechner im Netz. Ich weiß nicht mehr genau, wie ich das lösen konnte, aber zumindest mit Linux und Win95 habe ich bisher noch keine Probleme beim Zeichensatz beobachtet (Zugegriffen wird über die Gnome-Netzwerkumgebung, also über Nautilus und Gnomes Samba-VFS). Aber smbmount kann man AFAIK auch irgendwie mitteilen, welchen Zeichensatz es denn bitteschön verwenden soll, um mit der Außenwelt zu kommunizieren.

Zitat von Shivan:
Oder gibts ein XFS-Treiber für XP ??
Keine mir bekannten. Für ReiserFS (nur 3.6?) und ext2 habe ich schon was für Windows gesehen, für alles andere noch nicht.
  Mit Zitat antworten Zitat
sancho1980

Registriert seit: 7. Feb 2006
429 Beiträge
 
#7

Re: Unicode Dateiname umbenennen um ihn öffnen zu können

  Alt 21. Jun 2006, 16:29
Zitat von Shivan:
Delphi-Quellcode:

{: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 }
Brauche gerade für was Anderes auch so eine Funktion, die Strings in WideString umwandelt. Aber 2 Fragen:

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
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  Mit Zitat antworten Zitat
Benutzerbild von x000x
x000x

Registriert seit: 21. Jan 2004
Ort: Bei Hamburg
308 Beiträge
 
Delphi XE2 Professional
 
#8

Re: Unicode Dateiname umbenennen um ihn öffnen zu können

  Alt 21. Jun 2006, 19:07
Moin moin,
Zitat von sancho1980:
1) In welche Unit steht die Funktion: MultiByteToWideChar
Ist eine funktion der Kernel32.dll und zu finden in der Windows.pas. Dort findest du auch die Konstante MB_PRECOMPOSED.
Zitat von sancho1980:
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?
Je nachdem welches Zeichen/welchen Zeichensatz du darstellen willst. Zum Beispiel hat das 'ß' in
der cp 850 den Platz 225, in der cp 1252 dagegen den Platz 223. Bei Win1252 ist es dei Codepage 1252
Peter
-= Gruss Peter =-
-= alias x000x =-
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.052 Beiträge
 
Delphi 12 Athens
 
#9

Re: Unicode Dateiname umbenennen um ihn öffnen zu können

  Alt 21. Jun 2006, 19:42
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:17 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