[fpc-pascal] Re: Fpc Access Violation if AppConfigDir doesn't exist.

Michael Van Canneyt michael at freepascal.org
Sat Feb 9 14:27:31 CET 2013



On Sat, 9 Feb 2013, Giuliano Colla wrote:

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

Yes. 
Like I said, we can imagine a parameter 'AllowCreate' or 'ForceCreate'.

Michael.



More information about the fpc-pascal mailing list