[gelöst] Dateinamen und Umlaute

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 1196
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Manjaro Linux, Mint und Windows 10 ,Lazarus 3.99, FPC-Version: 3.3.1
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

[gelöst] Dateinamen und Umlaute

Beitrag von kralle »

Moin,

dieser Code hat Probleme mit Umlauten im Pfadnamen.

Code: Alles auswählen

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, ShellApi;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    SelectDirectoryDialog1: TSelectDirectoryDialog;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
 
function GetFileTypename(const Filename: string): string;
// Quelle: http://www.delphi-treff.de/tipps-tricks/dateienverzeichnisse/dateieigenschaften/dateityp-ermitteln/
 
var Info: TSHFileInfo;
begin
  if SHGetFileInfo(PChar(Filename), 0, Info, SizeOf(Info), SHGFI_TYPENAME) <> 0 then
    Result := Info.szTypeName
  else
    Result := '';
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  if SelectDirectoryDialog1.Execute then
    begin
      Memo1.Append('"'+SelectDirectoryDialog1.FileName+'" ist vom FileType= '+GetFileTypename(SelectDirectoryDialog1.FileName));
           if DirectoryExists(SelectDirectoryDialog1.FileName) then
        Memo1.Append(SelectDirectoryDialog1.FileName+' existiert.')
      else
        Memo1.Append('"'+SelectDirectoryDialog1.FileName+'" existiert nicht!      FileType= '+GetFileTypename(SelectDirectoryDialog1.FileName));
     Memo1.Append('---');
    end;
end;
 
end.
 
Ab dem Umlaut, werden die Verzeichnisse nicht mehr gefunden und der FileType bleibt leer.
Was muß ich ändern, damit Umlaute keine Probleme mehr machen?
Wie gehe ich bei FindFirst/FindNext vor, damit auch die keine Probleme mit Umlauten haben?

Gruß Heiko
Zuletzt geändert von kralle am Do 12. Mär 2015, 18:29, insgesamt 1-mal geändert.
OS: Manjaro Linux, Linux Mint und Windows 10
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1

Benutzeravatar
theo
Beiträge: 10873
Registriert: Mo 11. Sep 2006, 19:01

Re: Dateinamen und Umlaute

Beitrag von theo »

Die entsprechenden UTF-8 Fkt. verwenden:
http://wiki.freepascal.org/LCL_Unicode_ ... Dateinamen
und evtl. SHGetFileInfoW statt SHGetFileInfoA (FN umwandeln mit UTF8Decode).

Patito
Beiträge: 203
Registriert: Di 22. Sep 2009, 13:08
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Dateinamen und Umlaute

Beitrag von Patito »

theo hat geschrieben:Die entsprechenden UTF-8 Fkt. verwenden:
http://wiki.freepascal.org/LCL_Unicode_ ... Dateinamen
und evtl. SHGetFileInfoW statt SHGetFileInfoA (FN umwandeln mit UTF8Decode).
Funktioniert das denn generell?
Nicht jedes Filesystem erzwingt ein Encoding, das man verlustfrei nach UTF-8 hin und her umwandeln kann.

http://unix.stackexchange.com/questions ... s-on-linux

Zitat: "filenames and paths do not have an encoding; the OS only deals with sequence of bytes.
Individual applications may choose to interpret them as being encoded in some way, but this varies"

Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 1196
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Manjaro Linux, Mint und Windows 10 ,Lazarus 3.99, FPC-Version: 3.3.1
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

Re: Dateinamen und Umlaute

Beitrag von kralle »

Hallo Theo,
theo hat geschrieben:Die entsprechenden UTF-8 Fkt. verwenden:
http://wiki.freepascal.org/LCL_Unicode_ ... Dateinamen
Okay, das klappt.
theo hat geschrieben: und evtl. SHGetFileInfoW statt SHGetFileInfoA (FN umwandeln mit UTF8Decode).
Die scheinen aber nicht 1:1 austauschbar zu sein. :(

Fehlermeldung: :cry:
unit1.pas(40,45) Error: Call by var for arg no. 3 has to match exactly: Got "_SHFILEINFOA" expected "_SHFILEINFOW"
unit1.pas(41,15) Warning: Local variable "Info" does not seem to be initialized
unit1.pas(61) Fatal: There were 1 errors compiling module, stopping
Was will mir Lazarus mit der Zeile 1 sagen???

Gruß Heiko
OS: Manjaro Linux, Linux Mint und Windows 10
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1

Benutzeravatar
theo
Beiträge: 10873
Registriert: Mo 11. Sep 2006, 19:01

Re: Dateinamen und Umlaute

Beitrag von theo »

kralle hat geschrieben: Was will mir Lazarus mit der Zeile 1 sagen???
Na dass dort ein Zeiger auf einen WideString erwartet wird.

Probier mal so (nicht getestet):

Code: Alles auswählen

var Ws:WideString;
  Info: TSHFileInfoW;
begin
  Ws:=UTF8Decode(FileName);
  if  SHGetFileInfoW(@Ws, 0, Info, SizeOf(Info), SHGFI_TYPENAME) ....
 

Benutzeravatar
theo
Beiträge: 10873
Registriert: Mo 11. Sep 2006, 19:01

Re: Dateinamen und Umlaute

Beitrag von theo »

Patito hat geschrieben: Funktioniert das denn generell?
Nicht jedes Filesystem erzwingt ein Encoding, das man verlustfrei nach UTF-8 hin und her umwandeln kann.
Worauf willst du hinaus? Bzw. wie soll es denn sonst gehen?

Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 1196
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Manjaro Linux, Mint und Windows 10 ,Lazarus 3.99, FPC-Version: 3.3.1
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

Re: Dateinamen und Umlaute

Beitrag von kralle »

Hallo Theo,
theo hat geschrieben: Na dass dort ein Zeiger auf einen WideString erwartet wird.
Hätte ichnihct daraus gelesen ...
theo hat geschrieben: Probier mal so (nicht getestet):

Code: Alles auswählen

var Ws:WideString;
  Info: TSHFileInfoW;
begin
  Ws:=UTF8Decode(FileName);
  if  SHGetFileInfoW(@Ws, 0, Info, SizeOf(Info), SHGFI_TYPENAME) ....
 
Der Rückgabewert der Funktion bleibt leer ...

Gruß Heiko
OS: Manjaro Linux, Linux Mint und Windows 10
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1

Benutzeravatar
theo
Beiträge: 10873
Registriert: Mo 11. Sep 2006, 19:01

Re: Dateinamen und Umlaute

Beitrag von theo »

Dann probier so:

Code: Alles auswählen

 
SHGetFileInfoW(@WS[1], 0, Info, SizeOf(Info), SHGFI_TYPENAME)  
oder so:

Code: Alles auswählen

SHGetFileInfoW(PWideChar(WS), 0, Info, SizeOf(Info), SHGFI_TYPENAME) 

Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 1196
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Manjaro Linux, Mint und Windows 10 ,Lazarus 3.99, FPC-Version: 3.3.1
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

Re: Dateinamen und Umlaute

Beitrag von kralle »

Hallo Theo,
theo hat geschrieben:Dann probier so:

Code: Alles auswählen

 
SHGetFileInfoW(@WS[1], 0, Info, SizeOf(Info), SHGFI_TYPENAME)  
oder so:

Code: Alles auswählen

SHGetFileInfoW(PWideChar(WS), 0, Info, SizeOf(Info), SHGFI_TYPENAME) 
Da wäre ich nicht drauf gekommen.
das "@WS[1]" ist ein Array oder so?

Gruß Heiko
OS: Manjaro Linux, Linux Mint und Windows 10
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1

Benutzeravatar
theo
Beiträge: 10873
Registriert: Mo 11. Sep 2006, 19:01

Re: Dateinamen und Umlaute

Beitrag von theo »

kralle hat geschrieben:Hallo Theo,
theo hat geschrieben: Na dass dort ein Zeiger auf einen WideString erwartet wird.
Hätte ichnihct daraus gelesen ...
Stimmt, die Fehlermeldung bezog sich auf TSHFileInfo, was aber nicht heisst, dass die Sache mit dem PChar sauber funktioniert hätte.
kralle hat geschrieben: @WS[1]" ist ein Array oder so?
Naja, ein String ist ja eine Art Array of (Wide-) Char. Aber eigentlich geht es um den Zeiger auf den Speicherbereich.

Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 1196
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Manjaro Linux, Mint und Windows 10 ,Lazarus 3.99, FPC-Version: 3.3.1
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

Re: Dateinamen und Umlaute

Beitrag von kralle »

Hallo Theo,
theo hat geschrieben:Aber eigentlich geht es um den Zeiger auf den Speicherbereich.
Mit Zeigern habe ich nicht so, deshalb nutzte ich auch eine Digitaluhr :mrgreen:

Danke, für Deine Hilfe.

Gruß Heiko
OS: Manjaro Linux, Linux Mint und Windows 10
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1

Antworten