Использование SHGetSpecialFolderPath для извлечения папки приложения, к которой могут получить доступ также пользователи без прав администратора. Какой CSIDL выбрать?

В моем приложении я храню на каждой машине несколько файлов в папке приложения.

Упрощенная версия реального случая такова:

..\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)

Итак, вы можете понять, почему я использую это: чтобы сохранить некоторые данные, относящиеся к машине (помните последние входы в систему, сделанные с этой машины, своего рода MRU), для хранения строк перевода или сторонних компонентов (они извлекаются из среды выполнения из ресурсов exe) и для сохранения некоторых пользовательских данных ( нравится размер формы). Реальный случай более сложный, но, по крайней мере, вы можете понять, что есть несколько «общих папок» и несколько «пользовательских папок».

Теперь я хотел бы сохранить эту структуру, чтобы все мои файлы были в одном .. \ Папка Project1 (+ подпапки). Даже потому, что пользователи не являются пользователями Windows, а являются пользователями SQL Server.

Мой вопрос в том, какую папку выбрать для .. \ .

В настоящее время я (успешно) использую этот код для получения .. \

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;

И я вызываю его с помощью

GetSpecialFolder(CSIDL_APPDATA)

Где список CDISL определен здесь .

GetSpecialFolder (CSIDL_APPDATA) возвращает C: \ Users \ username \ AppData \ Roaming в Windows 7.

Раньше это работало, но недавно я получил некоторую жалобу от одного клиента, которая, кажется, напрямую связана с проблемы чтения / записи в этих папках. (например, C: \ Users \ username \ AppData \ Roaming \ Project1 \ LoginHistory - с использованием папок, перечисленных выше).

Итак, мой вопрос: правильно ли использовать CSIDL_APPDATA ? У вас есть еще одно предложение? Есть ли вероятность, что в какой-то ОС или у некоторых пользователей с действительно ограниченными правами могут возникнуть проблемы с чтением / записью в этой папке?

Пожалуйста, помните, что я не хотел бы иметь более одной корневой папки для моих файлов.

7
задан Gone Coding 30 June 2011 в 08:28
поделиться