Сохранение данных приложения и пользователя

Получение специальных каталогов, используя Delphi
Когда ваше Delphi-приложение нуждается в том, чтобы сохранить некоторую информацию на жёсткий диск пользователя, Вы должны быть осторожны, и должны разделять сохранение пользовательских данных, настроек для пользователя и настроек для компьютера.

Например, в Windows для сохранения специфических для приложения файлов, таких как INI-файлы, файлы состояния программы, временные файлы и т.п., должен быть использован каталог "Application Data".

Крайне нежелательно использовать жёстко прописанные пути вроде "C:\Program Files". При сохранении файлов в этом каталоге, приложение вряд ли будет корректно работать в других версиях Windows, потому что этот путь может быть изменён в следующих версиях Windows, либо пользователь может установить ОС на другой диск. К тому же, Windows Vista может не дать доступ ко многим каталогам. Даже пользователю с правами администратора.

WinAPI-функция SHGetFolderPath
Функция SHGetFolderPath определенна в модуле SHFolder. SHGetFolderPath возвращает полный путь к указанному специальному каталогу по его идентификатору.

Ниже приведена функция-обёртка для SHGetFolderPath, чтобы было проще получить стандартные каталоги (для всех пользователей или только для текущего пользователя).


uses SHFolder;  
...  
function GetSpecialFolderPath(folder : integer) : string;  
const  
  SHGFP_TYPE_CURRENT = 0;  
var  
  path: array [0..MAX_PATH] of char;  
begin  
  if SUCCEEDED(SHGetFolderPath(0,folder,0,SHGFP_TYPE_CURRENT,@path[0])) then  
    Result := path  
  else  
    Result := '';  
end;  

Теперь создадим приложение для использования функции SHGetFolderPath:

Положим на форму TRadioGroup ("RadioGroup1");
Положим на форму TLabel ("Label1")
Добавим пять элементов в RadioGroup (свойство Items):
"[Текущий пользователь]\My Documents"
"All Users\Application Data"
"[User Specific]\Application Data"
"Program Files"
"All Users\Documents"
Добавим обработчик события OnClick для RadioGroup.



//RadioGroup1 OnClick  
procedure TForm1.RadioGroup1Click(Sender: TObject);  
var  
  index : integer;  
  specialFolder : integer;  
begin  
  if RadioGroup1.ItemIndex = -1 then Exit;  
  index := RadioGroup1.ItemIndex;  
  case index of  
    //[Current User]My Documents  
    0: specialFolder := CSIDL_PERSONAL;  
    //All UsersApplication Data  
    1: specialFolder := CSIDL_COMMON_APPDATA;  
    //[User Specific]Application Data  
    2: specialFolder := CSIDL_LOCAL_APPDATA;  
    //Program Files  
    3: specialFolder := CSIDL_PROGRAM_FILES;  
    //All UsersDocuments  
    4: specialFolder := CSIDL_COMMON_DOCUMENTS;  
  end;  
  Label1.Caption := GetSpecialFolderPath(specialFolder) ;  
end;  

Примечание: "[Текущий пользователь]" - это имя пользователя, сеанс которого в данный момент активен в Windows.

Функция SHGetFolderPath является более расширенным вариантом функции SHGetSpecialFolderPath.

Программа не должна сохранять свою информацию (временные файлы, пользовательские настройки, файлы конфигурации приложения, и т.д.) в каталоге My Documents (Мои документы), либо в каталоге самого приложения (т.е. в одном из подкаталогов Program Files). Следует использовать специальный каталог в Application Data, отведённый именно для Вашего приложения. Как правило, его имя совпадает с именем каталога программы в Program Files).

Всегда создавайте подкаталог только в тех путях, которые возвращает функция SHGetFolderPath! Как правило, каталог создаётся такой: "\Application Data\Название компании\Название продукта\Версия продукта".

Пример программы с использованием функции, описанной в статье, можно загрузить здесь.
Теги:
Сохранение данных
Добавлено: 07 Августа 2018 21:39:29 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...