Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Betriebssysteme (https://www.delphipraxis.net/27-betriebssysteme/)
-   -   [Vista] lokalisierter Dateiname => realer Dateinamen (https://www.delphipraxis.net/94230-%5Bvista%5D-lokalisierter-dateiname-%3D-realer-dateinamen.html)

IB-Software 18. Jun 2007 14:58


[Vista] lokalisierter Dateiname => realer Dateinamen
 
Hallo,

unter Vista gibt es das Verzeichnis 'c:\Programme' nur noch als virtuelles Verzeichnis. Real heiß es 'c:\program files'.
Wenn ich ein Verzeichnis oder eine Datei habe, die in einem solchen virtuellen Verzeichnis ist, möchte ich dem Anwender aber den Verzeichnispfad auch entsprechend anbieten:

Also, wie mache ich aus:

c:\program files\Mein Programm\test.exe
c:\programme\Mein Programm\test.exe

Gibt es unter Vista eine entsprechende API Funktion?
Die Lösung soll natürlich auch mit allen anderen virtuellen Verzeichnissen funktionieren.

Danke im voraus für die Hilfe

Ingo

Daniel 18. Jun 2007 15:13

Re: [Vista] lokalisierter Dateiname => realer Dateinamen
 
Microsoft empfielht SHGetLocalizedName(), ich verwende ShGetFileInfo() mit dem Flag "SHGFI_DISPLAYNAME" und finde das netter, weil es diese Funktion auch unter früheren Windows-Versionen gibt.

Jelly 18. Jun 2007 15:27

Re: [Vista] lokalisierter Dateiname => realer Dateinamen
 
In einem der letzten Vista Videos wurde auf diese Problematik auch eingegangen, und gezeigt wie es geht.

Daniel 18. Jun 2007 15:30

Re: [Vista] lokalisierter Dateiname => realer Dateinamen
 
Eine Sache hatte ich allerdings nicht erwähnt: GetLocalizedName() verarbeitet ganze Pfadangaben und lokalisiert in einem Rutsch - die andere Funktion macht das meines Wissens nur ordnerweise. Man muss den Pfad also selber aufsplitten und dann wieder z'ambasteln.

IB-Software 18. Jun 2007 16:13

Re: [Vista] lokalisierter Dateiname => realer Dateinamen
 
Vielen Dank für den ersten Überblick.

Bei der Funktion SHGetLocalizedName sehe ich aber noch nicht ganz mit den Deklarationen der einzelnen Parameter durch.
pszPath ist ja noch klar = pchar

Aber die restlichen sind für mich nur 'böhmische Dörfer'.
Kann mir einer auf die Sprünge helfen.

Nochmals Danke im voraus.

Ingo

sakura 18. Jun 2007 16:36

Re: [Vista] lokalisierter Dateiname => realer Dateinamen
 
Zitat:

Zitat von IB-Software
pszPath ist ja noch klar = pchar

Nope, aber PWideChar :mrgreen:
Delphi-Quellcode:
function SHGetLocalizedName(
    pszPath: PWideChar;
    var pszResModule: PWideChar;
    cch: UINT;
    var pidsRes: Integer;
): HRESULT; stdcall;
...:cat:...

IB-Software 21. Jun 2007 10:20

Re: [Vista] lokalisierter Dateiname => realer Dateinamen
 
Danke an alle, klappt wunderbar.
Ich habe es mittels ShGetFileInfo() umgesetzt.

Gibt es aber auch die Möglichkeit des umgekehrten Weges, also dass man über den lokalen Namen den realen herausbekommt.
Ich stehe vor dem Problem dass der Anwender mittels 'Einfügen' einen virtuellen Pfad angeben könnte z. Bsp.

c:\programme\Meinprogramm\test.txt

Um die Datei richig zu speichern, benötige ich nun den Pfad

c:\program files\Meinprogramm\test.txt

Danke im voraus

Ingo

IB-Software 22. Jun 2007 08:34

Re: [Vista] lokalisierter Dateiname => realer Dateinamen
 
Habe inzwischen herausgefunden, dass beim abspeichern im Programmverzeichnis, also real 'c:\program files' der lokalisierte Name beim kopieren von Dateien automatisch angepasst wird.

Ich gehe dabei folgendermaßen vor:

Vor dem abspeichern überprüfe ich mittels DirectoryExists ob das Verzeichnis bereits existiert.
Wenn nicht erstelle ich es mit ForceDirectories.

Mit dem Programmverzeichnis klappt dies auch unter Vista bei Angabe des lokalisierten Verzeichnisnamens.
Wird allerdings als Zielverzeichnis (lokalisiert) z. Bsp. das Verzeichnis 'c:\Benutzer' angegeben, wird ein neues (reales) Verzeichnis 'c:\Benutzer' erstellt und die Datei dann darin gespeichert. Im Explorer werden dann (natürlich) zwei Verzeichnisse 'c:\Benutzer' angezeigt, was recht seltsam anmutet und nicht passieren sollte.

Da meine Anwender den Speicherort frei wählen können dürfen, möchte ich wie o.g. den lokalisierten Verzeichnisnamen in den realen wieder umwandeln.

Daher: Wie kann ich das umsetzen?

Danke im voraus für die Hilfe.

Ingo

Lasse2002 7. Sep 2007 10:42

Re: [Vista] lokalisierter Dateiname => realer Dateinamen
 
Die automatische Korrektur von Programme nach "Program Files" funktioniert auch nur, wenn unter Vista der entsprechende Junction Point erstellt ist. Bei einem deutschen Vista mit schwedischem Sprachpack ist das zum Beispiel nicht der Fall. Ich vermute mal, daß ein englisches Vista mit deutschem Sprachpack dasselbe Problem zeigt.

Ich vermute mal, daß man eine Funktion schreiben muß, die systematisch für jeden Ordner die lokalisierten und realen Dateinamen vergleicht. Sobald der Dateiname gefunden wurde, geht man in die nächste Ebene...

SHGetLocalizedName sollte man übrigens nur für Dateien nehmen, nicht für Verzeichnisse. So steht es zumindest im Platform SDK.

himitsu 29. Okt 2007 19:55

Re: [Vista] lokalisierter Dateiname => realer Dateinamen
 
Zitat:

Zitat von Lasse2002
SHGetLocalizedName sollte man übrigens nur für Dateien nehmen, nicht für Verzeichnisse. So steht es zumindest im Platform SDK.

hab jetzt nich nachgesehn, aber funktioniert SHGetLocalizedName nur bei reellen Dateien, oder mu die Datei nicht existieren?

Wenn nicht, dann könnte man sich da ja mit 'nem "virtullem" Dateinamen aushelfen:
irgendeinen Dateinamen anhängen De(Lokalisieren) und den Dateinamen wieder entfernen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:26 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