Programmatically get path to Application Support folder
Solution 1
This is outdated, for current best practice use FileManager.default.urls(for:in:)
as in the comment by @andyvn22 below.
the Best practice is to use NSSearchPathForDirectoriesInDomains
with NSApplicationSupportDirectory
as "long winded" as it may be.
Example:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES);
NSString *applicationSupportDirectory = [paths firstObject];
NSLog(@"applicationSupportDirectory: '%@'", applicationSupportDirectory);
NSLog output:
applicationSupportDirectory: '/Volumes/User/me/Library/Application Support'
Solution 2
Swift:
print(NSHomeDirectory())
or
print(FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first)
and
let yourString = String(FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first)
Solution 3
Swift 3:
FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first
Solution 4
Just to be sure people will start using the recommended way of doing this:
- (NSArray<NSURL *> * _Nonnull)URLsForDirectory:(NSSearchPathDirectory)directory
inDomains:(NSSearchPathDomainMask)domainMask
Expanded example from documentation:
- (NSURL*)applicationDataDirectory {
NSFileManager* sharedFM = [NSFileManager defaultManager];
NSArray* possibleURLs = [sharedFM URLsForDirectory:NSApplicationSupportDirectory
inDomains:NSUserDomainMask];
NSURL* appSupportDir = nil;
NSURL* appDirectory = nil;
if ([possibleURLs count] >= 1) {
// Use the first directory (if multiple are returned)
appSupportDir = [possibleURLs objectAtIndex:0];
}
// If a valid app support directory exists, add the
// app's bundle ID to it to specify the final directory.
if (appSupportDir) {
NSString* appBundleID = [[NSBundle mainBundle] bundleIdentifier];
appDirectory = [appSupportDir URLByAppendingPathComponent:appBundleID];
}
return appDirectory;
}
Solution 5
This works for me:
NSError *error;
NSURL* appSupportDir = [[NSFileManager defaultManager]
URLForDirectory:NSApplicationSupportDirectory
inDomain:NSUserDomainMask
appropriateForURL:nil
create:YES
error:&error];
Jack James
Updated on May 14, 2020Comments
-
Jack James almost 4 years
I'm trying to get an NSString for the user's Application Support folder.
I know I can do
NSString *path = @"~/Library/Application Support";
but this doesn't seem very elegant. I've played around with usingNSSearchPathForDirectoriesInDomains
but it seems to be quite long-winded and creates several unnecessary objects (at least, my implementation of it does).Is there a simple way to do this?