Locating macOS app support, preferences folders
(macOS only)
Overview
Application Support and Preferences Folders
The function below will return the location the macOS user/global application support directories and the user/global application preferences directories. You would not normally need to manually locate the macOS user preferences directory because the CFPreferences read/write methods will do this for you automatically.
As a bonus, the function below will also return the user/global application support directories for other operating systems.
Note: While the FSFindFolder() function was deprecated by Apple after macOS 10.8 (Mountain Lion), it is still available in macOS 10.15 (Catalina), In the interests of longevity, you may prefer to use the NSSearchPathForDirectoriesInDomains() function instead which is available in macOS 10.0+. See Locating macOS significant directories for details.
<syntaxhighlight lang="pascal>
...
Uses
{$IFDEF DARWIN}
MacOSAll, Files
{$ENDIF}
...
{platform-independent method to retrieve application support/preferences directories
Global: true (global location) _or_ false (user location)
FolderType: kApplicationSupportFolderType _or_ kPreferencesFolderType
User preferences live in the location returned by FSFindFolder(kUserDomain,kPreferencesFolderType).
User application support items live in the location returned by FSFindFolder(kUserDomain, kApplicationSupportFolderType).
Global preferences live in the location returned by FSFindFolder(kLocalDomain,kPreferencesFolderType).
Global application support items live in the location returned by FSFindFolder(kLocalDomain, kApplicationSupportFolderType).
}
function GetSupportDir(Global:boolean; FolderType:LongWord): String;
{$IFDEF DARWIN} const
kMaxPath = 1024;
var
theError: OSErr;
theRef: FSRef;
pathBuffer: PChar;
{$ENDIF} begin
{$IFDEF DARWIN}
theRef := Default(FSRef); // init
try
pathBuffer := Allocmem(kMaxPath);
except on exception
do exit;
end;
try
Fillchar(pathBuffer^, kMaxPath, #0); // actually already done by allocmem
Fillchar(theRef, Sizeof(theRef), #0); // actually already done by Default();
if Global then // kLocalDomain
theError := FSFindFolder(kLocalDomain, FolderType, kDontCreateFolder, theRef)
else // kUserDomain
theError := FSFindFolder(kUserDomain , FolderType, kDontCreateFolder, theRef);
if (pathBuffer <> nil) and (theError = noErr) then
begin
theError := FSRefMakePath(theRef, pathBuffer, kMaxPath);
if theError = noErr then
GetSupportDir := UTF8ToAnsi(StrPas(pathBuffer)) + '/' + ApplicationName + '/';
end;
finally
Freemem(pathBuffer);
end
{$ELSE}
//
// Other operating systems
//
GetSupportDir := GetAppConfigDirUTF8(Global);
{$ENDIF}
end;
Actual preference folder locations
- Preferences for sandboxed applications with the App Groups entitlement may be found in
~/Library/Group Containers/[app identifier]/Library/Preferences, where [app identifier] is something like com.companyname.appname or org.developername.appname but may be prefaced by alphanumeric characters. - Preferences for other sandboxed and all non-sandboxed applications may be found in
~/Library/Containers/[app identifier]/Data/Library/Preferences, where [app identifier] is something like com.companyname.appname or org.developername.appname. - Preferences which apply to all users, particularly if they apply before a user logs in, may normally be found in
/Library/Preferences. - Preferences which apply to an individual user, only after they have logged in, may normally be found in
~/Library/Preferences.
Preference files should be property list files and named something like com.companyname.appname.plist or org.developername.appname.plist. Using the CFPreferences read/write methods will do this for you automatically and will also use the correct folder locations.
See also
- Locating the macOS application resources directory
- Locating the macOS tmp directory
- Locating macOS significant directories.
- Reading and Writing macOS Preferences.
From the Free Pascal wiki, page "Locating macOS app support, preferences folders", as it stood on 2022-02-13 after a change by Thaddy, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.