Цитата:
Сообщение от Alegun
Единственное замечание, INI файлы имеют ограничение на размер файла в 64 Kb...
|
Ну, тут вы совершенно не правы.
Ini-файл уже давно устаревшая технология.
Единственное оправдание использованию ini-файла, это когда его действительно надо править "руками". Кстати, даже в этом случае, писать его рядом с программой больше не получится, по крайней мере начиная с Vista и 2003 (ну мы же не хотим всегда запускать программу от имени администратора?).
Реестр, в общем, тоже уже устаревающая технология, которая, кроме того, теперь имеет еще и особенности, в связи с появлением x64. Хотя именно она наиболее используемая в данное время.
Еще несколько лет назад MS предложила использовать xml (не помню как он там точно должен был называться, Application.configuration.xml что ли). Но проблемы запрета записи в Program Files это не решало.
В принципе, не столько важен формат хранения (ini, xml, binary, etc), как то, где хранить настройки и другие рабочие файлы данных программы (не пользователя, хотя в некоторых случаях даже их, если это всегда один файл). Начиная, если не ошибаюсь, с Windows XP, MS рекомендует использовать для этого "папку" Application Data, путь к которой получается с помощью вызова функции SHGetSpecialFolder. Таких папок для юзера 2: одна для конкретного юзера, вторая - для всех юзеров (у них разные CSIDL'ы).
Вот пример из моей программы, которая сохраняет данные пользователя в этом месте (пользовательская AppData) (собрано из разных модулей):
Код:
const
{$EXTERNALSYM CSIDL_COMMON_APPDATA}
CSIDL_COMMON_APPDATA = $0023;
function GetSpecialFolderPath(CSIDL : Integer) : String;
var
Path : PChar;
begin
Result := '';
GetMem(Path,MAX_PATH);
Try
If Not SHGetSpecialFolderPath(0,Path,CSIDL,False) Then
Raise Exception.Create('Shell function SHGetSpecialFolderPath fails.');
Result := Trim(StrPas(Path));
If Result = '' Then
Raise Exception.Create('Shell function SHGetSpecialFolderPath return an empty string.');
Result := IncludeTrailingPathDelimiter(Result);
Finally
FreeMem(Path,MAX_PATH);
End;
end;
function GetUserAppDataFolderPath : String;
begin
Result := GetSpecialFolderPath(CSIDL_APPDATA);
end;
function GetUserFileName(AForcePath : Boolean = False) : String;
var
APath : String;
begin
Try
APath := GetUserAppDataFolderPath;
APath := IncludeTrailingPathDelimiter(APath + 'Visual.Reminder');
If Not DirectoryExists(APath) Then
If AForcePath Then
If Not ForceDirectories(APath) Then
Raise Exception.Create('Can''t force user profile path.');
Except
APath := ExtractFilePath(Application.ExeName);
APath := IncludeTrailingPathDelimiter(APath);
End;
Result := APath + 'Reminders.vr';
end;
procedure TMainForm.SaveModel;
var
AFileName : String;
begin
AFileName := GetUserFileName(True);
Try
FModel.SaveToFile(AFileName);
Except
// Hide all exceptions
End;
end;