Wo speichern Sie die INI -Datei abhängig von Maschine (nicht Benutzer) unter Windows
-
12-09-2019 - |
Frage
Meine Anwendung speichert derzeit Einstellungen in einer INI -Datei unter dem aktuellen Benutzerprofil (Profil des aktuellen Benutzers ( C:\Documents and Settings\<CurrentUser>\Application Data\MyApplication\MySettings.ini
unter winxp). Ich habe jedoch festgestellt, dass einige dieser Einstellungen für die Maschine, nicht den Benutzer, einzigartig sind und daher möchten (tatsächlich brauchen), um sie an einem einzigen Ort für alle Benutzer zu speichern.
Gibt es einen Ordnerspeicherort unter Windows XP (und UP), an dem ich benutzerunabhängige Einstellungen speichern kann?
HINWEIS: Ich möchte sie weder im selben Ordner wie meine Bewerbung speichern noch in der Registrierung speichern.
Ich bemerke, dass es einen "alle Benutzer" -Fordner unter "C: Dokumenten und Einstellungen " gibt? Soll ich dort unter speichern?
Bonuspunkte: Es wird mir eher die Antwort an denjenigen vergeben, der mir auch sagen kann, wie ich diesen Weg in Delphi 7 von Windows zurückgibt.
Lösung
Für XP bietet Windows ShgetFolderPath () um einen bekannten Ort zu bekommen. Das CSIDL, das Sie suchen, ist CSIDL_COMMON_APPDATA
, beschrieben als:
Das Dateisystemverzeichnis, das Anwendungsdaten für alle Benutzer enthält. Ein typischer Weg ist
"C:\Documents and Settings\All Users\Application Data"
. Dieser Ordner wird für Anwendungsdaten verwendet, die nicht benutzerspezifisch sind. Beispielsweise kann eine Anwendung ein Zauberprüfungswörterbuch, eine Datenbank mit Clip-Kunst oder eine Protokolldatei in derCSIDL_COMMON_APPDATA
Mappe. Diese Informationen werden nicht durchlaufen und stehen jedem, der den Computer benutzt, zur Verfügung.
Für Vista und später wurde dies durch ersetzt Shget bekannte folderpath () Obwohl shgetFolderPath () immer noch als Wrapper -Funktion dafür verfügbar ist. Wenn Sie den echten Vista -Anruf verwenden, sollten Sie verwenden FOLDERID_ProgramData
Anstatt von CSIDL_COMMON_APPDATA
.
Dieser Link hier Scheint eine Art zu zeigen, wie man es tun kann.
Es scheint darauf zurückzuführen (behandeln Sie dies mit Umsicht, ich kenne Delphi nicht so gut):
function ShGetKnownFolderPath (
const rfid: TGUID;
dwFlags: DWord;
hToken: THandle;
out ppszPath: PWideChar): HResult;
var
Shell: HModule;
Fn: TShGetKnownFolderPath;
begin
Shell := LoadLibrary ('shell32.dll');
Win32Check(Shell <> 0);
try
@Fn := GetProcAddress (Shell, 'SHGetKnownFolderPath');
Win32Check (Assigned (Fn));
Result := Fn (rfid, dwFlags, hToken, ppszPath);
finally
FreeLibrary (Shell);
end;
end;
function GetKnownFolderPath (
const rfid: TGUID;
dwFlags: DWord;
hToken: THandle): WideString;
var
buffer: PWideChar;
ret: HResult;
begin
ret :=ShGetKnownFolderPath (rfid, dwFlags, hToken, buffer);
OleCheck (ret);
try
Result := buffer;
finally
CoTaskMemFree (buffer);
end;
end;
Diese Seite Bietet eine Liste aller CSIDL_*
und FOLDERID_*
Werte. Denken Sie daran, dass Sie diese Funktionen auch für Ihre benutzerspezifischen Daten verwenden sollten, nicht für hartcodierte Werte wie "C:\Documents and Settings\<CurrentUser>\Application Data\"
. Es kann sein, dass verschiedene Sprachversionen von Windows unterschiedliche Verzeichnisnamen verwenden oder dass Benutzer ihre Datenbereiche frei verschieben können.
Andere Tipps
Ich würde empfehlen, die Open Source zu verwenden Jedi -Code -Bibliothek für so etwas.
In jclshell.pas finden Sie GetSpecialFolderLocation ()
YourDataFolder := GetSpecialFolderLocation(CSIDL_COMMON_APPDATA);
Es ist kostenlos, gut getestet, funktioniert mit allen Windows -Versionen und isoliert Sie von zukünftigen Änderungen bis zur Windows -API.