programing tip

프로그래밍 방식으로 애플리케이션 지원 폴더 경로 가져 오기

itbloger 2020. 12. 29. 06:46
반응형

프로그래밍 방식으로 애플리케이션 지원 폴더 경로 가져 오기


사용자의 응용 프로그램 지원 폴더에 대한 NSString을 얻으려고합니다.

나는 할 수 있다는 것을 알고 NSString *path = @"~/Library/Application Support";있지만 이것은 그다지 우아하지 않은 것 같습니다. 나는 사용 NSSearchPathForDirectoriesInDomains하면서 놀았 지만 꽤 길고 불필요한 객체를 여러 개 생성하는 것 같습니다 (적어도 그것을 구현했습니다).

이를 수행하는 간단한 방법이 있습니까?


아래 @ andyvn22FileManager.default.urls(for:in:) 의 주석에서와 같이 현재 모범 사례 사용 위해 구식 입니다.

가장 좋은 방법 은와 NSSearchPathForDirectoriesInDomains함께 사용 하는 NSApplicationSupportDirectory것입니다.

예:

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

NSLog 출력 :

applicationSupportDirectory: '/Volumes/User/me/Library/Application Support'

스위프트 4 :

print(NSHomeDirectory())

또는

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

let yourString = String(FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first)

스위프트 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;
}

증명 링크 : 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);

문서 디렉토리에 읽고 쓰기위한 별도의 목적 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

참조 URL : https://stackoverflow.com/questions/8430777/programmatically-get-path-to-application-support-folder

반응형