Программно получить путь к папке поддержки приложений - PullRequest
54 голосов
/ 08 декабря 2011

Я пытаюсь получить NSString для папки поддержки приложений пользователя.

Я знаю, что могу сделать NSString *path = @"~/Library/Application Support";, но это выглядит не очень элегантно.Я поиграл с использованием NSSearchPathForDirectoriesInDomains, но он выглядит довольно скучным и создает несколько ненужных объектов (по крайней мере, моя реализация этого делает).

Есть ли простой способ сделать это?

Ответы [ 7 ]

67 голосов
/ 08 декабря 2011

Это устарело, для текущей лучшей практики используйте FileManager.default.urls(for:in:), как в комментарии к @ andyvn22 ниже.

Лучшая практика - использовать NSSearchPathForDirectoriesInDomains с NSApplicationSupportDirectory в качестве"длинная", как может быть.

Пример:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES);
NSString *applicationSupportDirectory = [paths firstObject];
NSLog(@"applicationSupportDirectory: '%@'", applicationSupportDirectory);

Вывод NSLog:

applicationSupportDirectory: '/Volumes/User/me/Library/Application Support'
30 голосов
/ 10 ноября 2015

Swift 4:

print(NSHomeDirectory())

или

print(FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first)

и

let yourString = String(FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first)
19 голосов
/ 27 сентября 2016

Swift 3:

FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first
7 голосов
/ 05 октября 2015

Просто чтобы быть уверенным, что люди начнут использовать рекомендуемый способ сделать это:

- (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;
}

Ссылка для подтверждения: https://developer.apple.com/library/ios/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/AccessingFilesandDirectories/AccessingFilesandDirectories.html#//apple_ref/doc/uid/TP40010672-CH3-SW3

2 голосов
/ 10 декабря 2015

Это работает для меня:

NSError *error;
NSURL* appSupportDir = [[NSFileManager defaultManager]     
         URLForDirectory:NSApplicationSupportDirectory
                inDomain:NSUserDomainMask
       appropriateForURL:nil
                  create:YES
                   error:&error];
0 голосов
/ 14 июля 2016

Создайте отдельный целевой класс 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
0 голосов
/ 21 февраля 2012

Это то, что я использую для получения базы данных. Получил это от класса Стэнфорда. Это может кому-нибудь помочь.

NSURL *url = [[[NSFileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
url = [url URLByAppendingPathComponent:@"database_name"];
NSLog(@"Database URL: %@",url);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...