Verwendung von SHGetSpecialFolderPath, um eine Anwendung, die Ordner zugegriffen werden kann, auch für nicht-admin-Benutzer, die CSIDL zu wählen?
In meiner Anwendung, die ich speichern auf jedem Rechner einige Dateien in einem Ordner vor.
Ist eine vereinfachte version des realen Fall ist dies:
..\Project1\LoginHistory (login history file - common for all users)
..\Project1\Translations (localization files - common for all users)
..\Project1\FormSettings\User1\ (this contains an ini file per form for User1)
..\Project1\FormSettings\UserN\ (this contains an ini file per form for UserN)
So können Sie sehen, warum ich dieses verwenden: um Daten zu speichern, die spezifisch für den Computer (Sie erinnern sich die neueste Anmeldungen aus dieser Maschine, eine Art von MRU), zum speichern von strings zu übersetzen oder 3rd-party-Komponenten (diese werden extrahiert Laufzeit von exe-Ressourcen) und speichern benutzerspezifische Daten (wie z.B. form, Größe). Im realen Fall ist komplexer, aber zumindest können Sie bekommen, dass es einige "gemeinsame Ordner" und einige "Benutzer-Ordner".
Nun würde ich gerne halten, diese Struktur, so dass alle meine Dateien in einem einzigen ..\Project1-Ordner (+ Unterordner). Auch, weil die Nutzer nicht die windows-Benutzer, aber Sie sind SQL Server-Benutzer.
Meine Frage ist, welche Ordner, den Sie für ..\
.
Derzeit bin ich (erfolgreich) mit diesem code für retrieveing ..\
uses ShlObj;
function GetSpecialFolder(const CSIDL: integer) : string;
var
RecPath : PWideChar;
begin
RecPath := StrAlloc(MAX_PATH);
try
FillChar(RecPath^, MAX_PATH, 0);
if SHGetSpecialFolderPath(0, RecPath, CSIDL, false)
then result := RecPath
else result := '';
finally
StrDispose(RecPath);
end;
end;
Und ich nenne es mit
GetSpecialFolder(CSIDL_APPDATA)
Wobei die Liste der CDISL definiert ist hier.
GetSpecialFolder(CSIDL_APPDATA)
zurück C:\Users\username\AppData\Roaming
in Windows 7.
Damit dies funktionierte, aber vor kurzem erhielt ich einige Beschwerde von einem Kunden, der scheint in direktem Zusammenhang zu Lesen/schreiben, die Probleme in diesen Ordner. (zum Beispiel C:\Users\username\AppData\Roaming\Project1\LoginHistory
- Ordner die oben aufgeführt).
Also meine Frage ist: ist es richtig zu verwenden CSIDL_APPDATA
? Haben Sie einen anderen Vorschlag? Gibt es eine chance, dass auf einigen OS oder mit einigen Benutzern mit sehr reduzierten Privilegien kann es Lesen/schreiben Probleme auf, die Ordner?
Bitte denkt daran, dass ich nicht gerne mehr als einen root-Ordner für meine Dateien.
- Benutzer müssen in der Lage sein, um dort zu schreiben. Sonst das ganze system zusammenbricht. Haben Sie vielleicht benötigen, um fehlende Verzeichnisse erstellen, bevor Sie das schreiben von Dateien? Es ist schwer zu Debuggen, wenn Sie sagen uns nicht, den Fehler-code und die Nachricht!!
- Ja, wenn die user nicht schreiben kann, natürlich ist die ganze Idee nicht funktioniert. Ich bin nicht in der Lage, das problem zu reproduzieren, bin ich gerade erfahren, dass jemand dieses problem hat, so bin ich versucht, zu erraten, was ist der Grund. Probabyl werde ich eine chance haben, um es zu untersuchen weiter, aber nicht jetzt. Dies ist der Grund, warum ich fragte.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, dass Sie verwenden möchten
CSIDL_COMMON_APPDATA
für Dateien, die nicht Benutzer-spezifisch ist. Wenn Sie angenommen wird (in deinem code), die gespeicherten Dateien inCSIDL_APPDATA
sind für die Benutzer freigegeben, das ist nicht erlaubt.CSIDL_COMMON_APPDATA
und nicht vonCSIDL_APPDATA
? Ich meine, durch den Wechsel zuCSIDL_COMMON_APPDATA
gibt es Chancen, dass die Dinge besser gehen, oder nicht? Oder sind Sie darauf hindeutet, nur weil "semantisch" es wäre eine bessere Wahl (und ich Stimme mit Ihnen überein)?CSIDL_COMMON_APPDATA
ist 100% besser ist, hier (msdn.microsoft.com/en-us/library/bb762494(v=vs. 85).aspx) Sie sagen auch, dass "Diese information wird nicht übernommen, und ist für jedermann verfügbar mit dem computer.". Zwar ist dies nicht geschrieben fürCSIDL_APPDATA
.Ich den Ansatz verwenden, endlich die richtige ist. Da ich nicht wirklich brauchen gemeinsame Dateien für meine Anwendung (es macht Sinn, dass alle temp-Dateien sind vom Benutzer bestimmten - wegen der paar Allgemeine Dinge, die gespeichert werden in der DB)
CSIDL_APPDATA
ist ein guter Ort.Das problem, das ich konfrontiert war, ist es noch nicht klar, aber ich vermute, es ist aufgrund der Tatsache, dass login.ini ist ein reserviertes Wort ist (erst vor kurzem, nach einigen letzten windows-update vielleicht).
Ich schon gefragt diese Frage.