Программно получить путь к папке поддержки приложений
Я пытаюсь получить NSString для пользовательской папки поддержки приложений.
Я знаю, что могу сделать NSString *path = @"~/Library/Application Support";
, но это не кажется очень изящным. Я играл с использованием NSSearchPathForDirectoriesInDomains
, но, похоже, он довольно длинный и создает несколько ненужных объектов (по крайней мере, моя реализация).
Есть ли простой способ сделать это?
Ответы
Ответ 1
Лучшей практикой является использование NSSearchPathForDirectoriesInDomains
с NSApplicationSupportDirectory
как "длинная завивка", как это может быть.
Пример:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES);
NSString *applicationSupportDirectory = [paths firstObject];
NSLog(@"applicationSupportDirectory: '%@'", applicationSupportDirectory);
Выход NSLog:
applicationSupportDirectory: '/Volumes/User/me/Library/Application Support'
Ответ 2
Swift 4:
print(NSHomeDirectory())
или
print(FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first)
и
let yourString = String(FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first)
Ответ 3
Swift 3:
FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first
Ответ 4
Просто чтобы убедиться, что люди начнут использовать рекомендуемый способ:
- (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 bundle ID to it to specify the final directory.
if (appSupportDir) {
NSString* appBundleID = [[NSBundle mainBundle] bundleIdentifier];
appDirectory = [appSupportDir URLByAppendingPathComponent:appBundleID];
}
return appDirectory;
}
Ссылка на доказательство: https://developer.apple.com/library/ios/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/AccessingFilesandDirectories/AccessingFilesandDirectories.html#//apple_ref/doc/uid/TP40010672-CH3-SW3
Ответ 5
Это работает для меня:
NSError *error;
NSURL* appSupportDir = [[NSFileManager defaultManager]
URLForDirectory:NSApplicationSupportDirectory
inDomain:NSUserDomainMask
appropriateForURL:nil
create:YES
error:&error];
Ответ 6
Это то, что я использую для получения базы данных. Получил это из класса Стэнфорда. Это может помочь кому-то.
NSURL *url = [[[NSFileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
url = [url URLByAppendingPathComponent:@"database_name"];
NSLog(@"Database URL: %@",url);
Ответ 7
Создайте отдельный объектный класс 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