![]() |
wie Localized Pathname auslesen?
Moin moin,
vorallem seit Vista kommt man ja um die lokalisierten Namen nicht mehr drumrum. Nun meine Frage: kennt wer einen einfachen Weg diese auszulesen? Im Moment implementiere ich dieses noch manuell (also INI und DLL-Resoursen auslesen) PS: mit den nächsten Updates wird vermutlich ein kleiner Desktop.ini-Editor mit in meinem SearchSameFile enthalten sein (da der ja eh ein komplettes Verzeichnislistening erlaubt, erstell ich mir jetzt keine Extra Anwendung dafür ... auch wird man dort Hardlinks editieren können. ob auch noch softlinks/junctions dazukommen, muß ich mir noch überlegen) |
Re: Localized Pathname
Meinst du
![]() |
Re: Localized Pathname
Du meinst z.B. C:\Benutzer anstelle von C:\Users etc? In der JVCL gibt es ne PathEdit Compo mit ner entsprechenden Property. Schau doch mal, wie das dort gelöst ist.
|
Re: Localized Pathname
Und genau das sind die erwähnten Special Folders.
|
Re: Localized Pathname
nja, falls es noch nicht aufgefallen ist, aber das Dateisystem spricht da ja nun "einheitlich" englisch
z.B. "Documents and Settings" wobei der Explorer es aber in der Systemsprache anzeigt z.B. "Dokumente und Einstellungen" na ich schau mal, ob es damit effektiver geht wie gesagt, ich arbeite direkt mit der WinAPI und lese ganze Verzeichnisbäume aus, da sollte es auch nicht zu umständlich arbeiten. und Vorteil des eigenen Auslesen wäre, daß ich es optimieren kann und nicht für jede Datei und Verzeichnis einzeln behandeln muß. [edit] nein, nicht Special Folders. die Beispiele sind zwar zufällig welche, aber dieses geht mit jedem beliebigen Verzeichnis. |
Re: Localized Pathname
der Vorteil es mit den Special Folders zu machen, wäre die Unabhängigkeit vom OS und Landeseinstellungen.
|
Re: Localized Pathname
Liste der Anhänge anzeigen (Anzahl: 1)
wie gesagt, nicht Special Folders :?
ich hab mal ein Beispiel angehängt dieses erstellt einen Ordner mit 'nem lokalisierten Namen, welcher laut Anzeige "Papierkorb" nennen wird, aber in Wirklichkeit heißt er "ich heisse aber anders" :mrgreen: |
Re: wie Localized Pathname auslesen?
Schau Dir mal das JvDirectory Edit aus der JediVCL an, das kann IMHO die Pfade übersetzen :zwinker:
|
Re: wie Localized Pathname auslesen?
da es hier nicht installiert ist (nutze teilweise meine eigenen API-Header) ... aber mal sehn, ob ich dennoch etwas finde :angel:
|
Re: wie Localized Pathname auslesen?
Liegt ja im Source vor. :zwinker:
|
Re: wie Localized Pathname auslesen?
erstmal runterladen ... bin schon den ganzen Tag nur mit GPRS unterwegs und selbst das noch nichtmal "schnell"
schlimm wird es nur, da man auch Dateinamen lokalisieren kann und nicht nur Verzeichnisnamen. alleine für den Verzeichnisnamen ergibt das bei meiner eigenen Implementierung eine etwa 30-zeilige Funktion und das Selbe würde bestimmt nochmal für die lokalisierten Dateinamen entstehen. [add] was man so findet :shock: ![]() |
Re: wie Localized Pathname auslesen?
so, hier erstmal meine Methode: sie ließt den lokalisierten Namen eines Verzeichnisses aus
und sie scheint auch zu funktionieren :stupid: (ich hoffe aber, daß hier jetzt auch immernoch alles geht, nachdem ich mein UTF8 nach String geändert hab und die Version im SSF zeigt auch "defekte" Namen an, wärend diese hier nach Windowsstandard nur korrekte Angaben liefert)
Delphi-Quellcode:
soooo, jetzt müßte gleich das JVCL geladen sein und dann mal sehn, ob ich da was Schöneres finde :)
Function ReadIniString(Const FileName, Section, Ident: String): String;
Var H: THandle; S, S2: String; i, i2: Integer; Begin Result := ''; SetLength(S, 1016); SetLength(S, GetPrivateProfileString(PChar(Section), PChar(Ident), nil, PChar(S), Length(S) + 1, PChar(FileName))); i := Pos(',', S); If (S <> '') Then Begin If (S[1] = '@') and (i > 0) and TryStrToInt(Copy(S, i + 1, 99), i2) and (i2 < 0) Then Begin S := Copy(S, 2, i - 2); SetLength(S2, 1016); SetLength(S2, ExpandEnvironmentStrings(PChar(S), PChar(S2), Length(S2) + 1) - 1); H := GetModuleHandle(PChar(S2)); If H = 0 Then Begin H := LoadLibraryEx(PChar(S2), 0, LOAD_LIBRARY_AS_DATAFILE); i := 0; End; If H <> 0 Then Begin S := ''; SetLength(Result, 1016); SetLength(Result, LoadString(H, -i2, PChar(Result), Length(Result) + 1)); If i = 0 Then FreeLibrary(H); End; End; End; End; // Achtung Pseudocode-Variablen: If Directory.Attributes and (FILE_ATTRIBUTE_READONLY or FILE_ATTRIBUTE_SYSTEM) <> 0 Then LocalizedName := ReadIniString(Directory + '\Desktop.ini', '.ShellClassInfo', 'LocalizedResourceName'); |
Re: wie Localized Pathname auslesen?
So, in der JCL befindet sich eine Funktion Namens JclFileUtils.PathGetLocalizedPath
und ihre Umkehrfunktion JclFileUtils.PathGetPhysicalPath. Diese können gleich einen ganzen relativen (glaub sich zumindestens) oder absoluten Pfad übersetzen können, also in/von - Anzeigepfad, so wie er z.B. im Explorer angezeigt wird - physischen Pfad, so wie er für den ganzen Dateifunktionen benötigt wird TOpenDialog zeigt auch den Anzeigepfad an, liefert aber als Ergebnis den physischen Pfad. Da diese Funktionen aber 1. den Pfad parsen, versuchen in einzelne Dateien/Verzeichnisse zu zerlegen und dann 2. jeden Ordner einzeln umwandeln und dann auch noch 3. recht "umständlich" über z.B. mit folgenen Funktionen arbeiten: IShellFolder.ParseDisplayName IShellFolder.BindToObject IShellFolder.EnumObjects IShellFolder.GetDisplayNameOf Belasse ich es in meinem Fall bei meiner Variante, welche allerdings nur einen Pfadnamen (ohne direkt Pfadangabe, also mit getrenntem Elternverzeichnis) umwandeln kann, da dieses für meinen Fall optimaler scheint. Ich könnte zwar auch den einzelnen Pfadnamen über diese oben genannten Funktionen oder auch direkt über die Funktionalitäten von IShellFolder umwandeln, aber ich glaub optimaler wird es so nicht unbedingt. :nerd: PS: um eure User nicht mit "komischen" Pfadnamen zu verwirren, empfehle ich, wenn ihr vor Anzeige eines Pfades (z.B. in einem Label oder Edit) diesen in den Lokalisierten Namen umwandelt. Nicht daß er sich Wundert, daß euer Programm C:\Users\... anzeigt, aber er nur C:\Benutzer\... bei sich findet. :zwinker: Dabei sollten diese Funktionen bis zu Win9x hinunter funktionieren, auch wenn sie da recht selten einen lokalisierten Namen vorfinden, was ja aber egal ist. und sorry für den Mehrfachpost, aber es sind ja auch getrennte Dinge |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:53 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-2025 by Thomas Breitkreuz