Получение специальных каталогов, используя 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:
//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\Название компании\Название продукта\Версия продукта".
Пример программы с использованием функции, описанной в статье,
можно загрузить
здесь.
|