以编程方式获取“应用程序支持”文件夹
我正在尝试获取用户的应用程序支持文件夹的NSString。
我知道我可以做NSString *path = @"~/Library/Application Support";
但是这看起来不是很优雅。 我玩过使用NSSearchPathForDirectoriesInDomains
但它似乎很啰嗦,并创build了几个不必要的对象(至less,我的执行情况呢)。
有一个简单的方法来做到这一点?
最佳做法是使用NSApplicationSupportDirectory
NSSearchPathForDirectoriesInDomains
,因为它可能是“冗长的”。
例:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES); NSString *applicationSupportDirectory = [paths firstObject]; NSLog(@"applicationSupportDirectory: '%@'", applicationSupportDirectory);
NSLog输出:
applicationSupportDirectory: '/Volumes/User/me/Library/Application Support'
Swift 4:
print(NSHomeDirectory())
要么
print(FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first)
和
let yourString = String(FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first)
Swift 3:
FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first
只是为了确保人们会开始使用推荐的方式来做到这一点:
- (NSArray<NSURL *> * _Nonnull)URLsForDirectory:(NSSearchPathDirectory)directory inDomains:(NSSearchPathDomainMask)domainMask
文档中的扩展示例:
- (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; }
certificate链接: https : //developer.apple.com/library/ios/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/AccessingFilesandDirectories/AccessingFilesandDirectories.html#//apple_ref/doc/uid/TP40010672-CH3-SW3
这适用于我:
NSError *error; NSURL* appSupportDir = [[NSFileManager defaultManager] URLForDirectory:NSApplicationSupportDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:&error];
这是我用来获取数据库。 从斯坦福大学上课了 这可能有助于某人。
NSURL *url = [[[NSFileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; url = [url URLByAppendingPathComponent:@"database_name"]; NSLog(@"Database URL: %@",url);
创build单独的目标C类,用于读写文档目录。 我将避免代码重写。 下面是我的版本。
//Directory.h #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> #define PATH (NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)) #define BASEPATH (([PATH count] > 0)? [PATH objectAtIndex:0] : nil) @interface DocumentsDirectory : NSObject //Here you can also use URL path as return type and file path. +(void)removeFilesfromDocumentsDirectory:(NSString*)filename; +(NSString*)writeFiletoDocumentsDirectory:(NSString*)filename; @end #import "Directory.h" @implementation DocumentsDirectory UIAlertView *updateAlert; +(void)removeFilesfromDocumentsDirectory:(NSString*)filename { NSFileManager *fileManager = [NSFileManager defaultManager]; NSString *filePath = [BASEPATH stringByAppendingPathComponent:filename]; NSError *error; BOOL success = [fileManager removeItemAtPath:filePath error:&error]; //Remove or delete file from documents directory. if (success) { updateAlert= [[UIAlertView alloc] initWithTitle:@"Congratulations:" message:@"File is updated successfully" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [updateAlert show]; } else { NSLog(@"Could not delete file -:%@ ",[error localizedDescription]); updateAlert= [[UIAlertView alloc] initWithTitle:@"Try again:" message:[error localizedDescription] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [updateAlert show]; } } +(NSString*)writeFiletoDocumentsDirectory:(NSString*)filename { NSString *foldDestination = BASEPATH; NSString *filePath = [foldDestination stringByAppendingPathComponent:filename]; return filePath; } @end