[fpc-pascal] Re: Fpc Access Violation if AppConfigDir doesn't exist.
Giuliano Colla
giuliano.colla at fastwebnet.it
Sat Feb 9 13:25:52 CET 2013
Il 09/02/2013 10:25, Michael Van Canneyt ha scritto:
>
>
> On Sat, 9 Feb 2013, Reinier Olislagers wrote:
>
>> On 9-2-2013 1:49, Giuliano Colla wrote:
>>> It turned out that the reason was simply that the default AppConfigDir
>>> (~/.config/ ) wasn't there, and therefore in the two usual lines
>>>
>>> AppConfigFileName:= GetAppConfigFile(False);
>>> ini := TIniFile.Create(AppConfigFileName);
>>>
>>> the second line was generating the access violation.
>>>
>>> Desktop specs tell where configuration data should go, but they don't
>>> guarantee that the directory exists. Other applications take care of
>>> creating if it doesn't exist, but its presence depends on which
>>> applications you launch.
>>>
>>> Of course, once one knows, one can use ForceDirectories in the
>>> application code, but it would be much more user friendly if
>>> XdgConfigHome (or SysConfigDir when it will be implemented) in sysutils
>>> took care of that. You ask for the default configuration path to put
>>> your data in, and you get a sane and *existing* path.
>>> It would also be nice if TIniFile.Create didn't generate an Access
>>> Violation if the file can't be created.
>>>
>>> Should I open an issue on the bugtracker on this subject, or I'm the
>>> only one to think that it's a bug/required feature?
>>>
>> If I were you, I'd open an issue. I agree this is a problem.
>
> It is not a problem.
>
> You should READ the documentation when using functions:
>
> http://www.freepascal.org/docs-html/rtl/sysutils/getappconfigdir.html
>
> Specifically
>
> "This does not mean that the directory exists, or that the user can
> write in this directory (especially if Global=True).
> It just returns the name of the appropriate location."
>
> So it is not a bug.
>
> We can maybe have an appropriate 'AllowCreate' or 'EnsureDir'
> parameter or so. But for system config directories, this is nonsense,
> so it should be optional.
>
I can easily accept that it's not a bug, but you must agree with me that
it's a problem.
If every user application must include code between GetAppConfigxx and
TIniFile.Create to extract the path and ensure that it exists, even for
the trivial case Global=false, then it's reasonable that the right place
for that code is in system functions, and not in user application.
Maybe the right thing to fix isn't GetAppConfigxx, but TInifile.Create,
which doesn't return any warning if the file path doesn't exist, and
will just SigSev on a subsequent ini.WriteWhatever.
TIniFile silently creates the file if it doesn't exist, letting you
think that it takes care of everything, then why shouldn't it also
create the path if it doesn't exist? (provided it's writable, of course,
but Global=true requires special handling in any case, it's not for
everybody).
Giuliano
More information about the fpc-pascal
mailing list