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.
InformationsquelleAutor LaBracca | 2011-02-23
Schreibe einen Kommentar