![]() |
Relativer Pfad & co.
Hallo, ich habe schon wieder eine Frage:
Wenn ich das Programm etwas abspeichern lassen will, dann stehe ich vor dem Rätsel, wie ich das mache. Mein Ordnerbaum sieht ungefähr so aus: Projektordner(der ist ja dann verschieden, daher das Problem) --->Saves(hier will ich es abspeichern) Meine Fragen also: :?: Gibt es eine Variable, für den Anwendungspfad? :?: Gibt es eine einfache Möglichkeit, etwas in den Documents Ordner zu speichern. (Wäre meine 2. Wahl, weil man es von dort nicht wegbekommt, wenn man den Anwendungsordner löscht...) Warum das alles? Ich will eben, dass dieses Programm auf jedem PC läuft(zumindest auf denen mit vista oder XP ) :!: Ich habe bereits gegooglet und co, aber nichts für mich gefunden... Danke schonmal für eure Hilfe. |
Re: Relativer Pfad & co.
Zitat:
![]() ![]() |
Re: Relativer Pfad & co.
Den Anwendungspfad bekommst Du mit
Delphi-Quellcode:
, aber es ist u.U. keine gute Idee, dorthin zu speichern. Um den Anwendungsdatenpfad zu ermitteln, kannst Du mal die DP-Suche nach CSIDL_APPDATA bemühen, da sollten sich einige Lösungen finden lassen.
ExtractFilePath(ParamStr(0))
|
Re: Relativer Pfad & co.
Unter einem Anwendungspfad verstehe ich folgendes:
Der Ort, wo die Anwendung liegt(z.B.: C:\Programme\hier noch ein paar ordner\Codegear\ und so weiter bis \bds.exe) |
Re: Relativer Pfad & co.
Genau. Unter ordentlichen Betriebssystemen (Unix, Linuxen, Windows ab Vista, XP eingeschränkt - nur bei Usern ohne Adminrechten) hat eine Anwendung in ihrem Anwendungsverzeichnis keine Rechte um dort irgendwas abzulegen. Das heisst Du solltest Dir lieber nochmal überlegen, für welchen Anwenderkreis diese Daten les- bzw. sogar schreibbar sein sollen und dann das richtige Verzeichnis dafür auswählen, dass Dir das Betriebssystem mit den SpecialFolders auch für die jeweilge Installation korrekt zurückliefert.
Edit: Documents (CSIDL_PERSONAL) wäre im übrigen nur dann richtig, wenn diese Daten nur für den aktuellen Benutzer zugänglich sein sollen. Ein anderer User hat dann seine eigenen Daten. Für alle Benutzer wäre dann CSIDL_COMMON_DOCUMENTS der richtige Ort. Was das Entfernen angeht: Einfach in das Setup eine Uninstall-Routine einbauen die genau diese Orte auch aufräumt und gut ist. |
Re: Relativer Pfad & co.
IIRC heißt die zugehörige Funktion SHGetFolder aus der Unit SHFolders. Schau Dir die mal an.
|
Re: Relativer Pfad & co.
Ganz ganz dumme Idee dort was abspeichern zu wollen. Nur Administratoren können schreibend auf den Ordner zugreifen. Bedeutet Windowsuser ohne Administrator Rechte (= alle Vistabenutzer mit aktivierter UAC) können Deine Anwendung dann wahrscheinlich gar nicht oder nur sehr eingeschränkt nutzen. Entsprechend benutz lieber einen der dafür vorgesehenen Ordner (Public wenn für alle Nutzer sichtbar, Benutzerordner für die benutzerspezifischen Einstellungen).
|
Re: Relativer Pfad & co.
Ich habe jetzt den Special Folders Link von mkinzler genutzt und die Sachen eingebaut, bekomme aber dann folgende Exception: (Nachdem ich mit ForceDirectories den Pfad ersetllt habe)
Im Projekt -Hier der Projektname- ist eine Exception der Klasse EFCreateError mit der Meldung 'Datei "C:\Users\-Hier mein Benutzername am PC-\Documents\Saves\EineDatei.txt" kann nicht erstellt werden. Das System kann den angegebenen PFad nich finden' aufgetreten. |
Re: Relativer Pfad & co.
Zeig mal Deinen Code.
|
Re: Relativer Pfad & co.
Delphi-Quellcode:
Der Teil für die GetSpecialFolder funktion
function TForm1.GetSpecialFolder(hWindow: HWND; Folder: Integer): String;
var pMalloc: IMalloc; pidl: PItemIDList; Path: PChar; begin // get IMalloc interface pointer if (SHGetMalloc(pMalloc) <> S_OK) then begin MessageBox(hWindow, 'Couldn''t get pointer to IMalloc interface.', 'SHGetMalloc(pMalloc)', 16); Exit; end; // retrieve path SHGetSpecialFolderLocation(hWindow, Folder, pidl); GetMem(Path, MAX_PATH); SHGetPathFromIDList(pidl, Path); Result := Path; FreeMem(Path); // free memory allocated by SHGetSpecialFolderLocation pMalloc.Free(pidl); end;
Delphi-Quellcode:
Hier wird eine Datei geladen, falls sie vorhanden ist und der Pfad wird davor erstellt(wenn ich ForceDirectories vor das try schiebe änderts auch nichts)
...
Game := TStringlist.Create; try ForceDirectories(GetSpecialFolder(Handle, CSIDL_PERSONAL )+'/Saves'); Game.LoadFromFile(GetSpecialFolder(Handle, CSIDL_PERSONAL )+'/Saves/'+NameF+'.txt'); ...
Delphi-Quellcode:
Hier kommt dann der Fehler
...
Game.SaveToFile(GetSpecialFolder(Handle, CSIDL_PERSONAL )+'/Saves/'+NameF+'.txt'); ... Und natürlich setze ich Game nachher immer auf .Free |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:08 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