[ios] 문서 디렉토리 (NSDocumentDirectory) 란 무엇입니까?

누군가 iOS 앱의 문서 디렉토리가 무엇이며 언제 사용하는지 설명해 줄 수 있습니까?

현재 내가 믿는 것은 다음과 같습니다.

나에게 그것은 사용자가 앱에 필요한 모든 파일을 저장할 수있는 중앙 폴더 인 것 같습니다.

이것은 Core Data가 데이터를 저장하는 위치와 다른 위치입니까?

각 앱이 자체 문서 디렉토리를 얻는 것 같습니다.

문서 디렉토리 / 이미지 또는 문서 디렉토리 / 비디오와 같은 문서 디렉토리의 하위 디렉토리를 자유롭게 만들 수 있습니까?



답변

탈옥되지 않은 기기에서만 앱이 ‘샌드 박스’환경에서 실행됩니다. 즉, 자체 콘텐츠 내의 파일 및 디렉터리에만 액세스 할 수 있습니다. 예를 들어 문서라이브러리 .

iOS 애플리케이션 프로그래밍 가이드를 참조하십시오 .

응용 프로그램 샌드 박스 의 Documents 디렉토리에 액세스하려면 다음을 사용할 수 있습니다.

iOS 8 이상, 권장되는 방법입니다.

+ (NSURL *)applicationDocumentsDirectory
{
     return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}

iOS 7 또는 이전 버전을 지원해야하는 경우

+ (NSString *) applicationDocumentsDirectory
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *basePath = paths.firstObject;
    return basePath;
}

문서 디렉토리를 사용하면 앱에서 만들거나 필요할 수있는 파일 및 하위 디렉토리를 저장할 수 있습니다.

앱 샌드 박스 의 Library 디렉토리 에있는 파일에 액세스하려면 위의 위치를 ​​사용합니다 paths.

[NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0]


답변

이는 iOS 8에서 변경되었습니다. 다음 기술 노트를 참조하십시오. https://developer.apple.com/library/ios/technotes/tn2406/_index.html

Apple이 승인 한 방법 (위 링크 참조)은 다음과 같습니다.

// Returns the URL to the application's Documents directory.
- (NSURL *)applicationDocumentsDirectory
{
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}


답변

수락 된 답변이 제안한 문서에서 코드를 찾을 수 없지만 여기에서 업데이트 된 해당 코드를 찾았습니다.

파일 시스템 프로그래밍 가이드 :: 파일 및 디렉토리 액세스»

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

NSSearchPathForDirectoriesInDomain의 사용을 권장하지 않습니다.

NSSearchPathForDirectoriesInDomains 함수는 URLsForDirectory : inDomains : 메소드처럼 작동하지만 디렉토리의 위치를 ​​문자열 기반 경로로 반환합니다. 대신 URLsForDirectory : inDomains : 메소드를 사용해야합니다.

여기에 다른 유용한 디렉토리 상수가 있습니다. 이 모든 것이 iOS에서 지원되는 것은 아닙니다. 또한 다음과 같은 NSHomeDirectory () 함수를 사용할 수 있습니다.

iOS에서 홈 디렉토리는 애플리케이션의 샌드 박스 디렉토리입니다. OS X에서는 애플리케이션의 샌드 박스 디렉토리 또는 현재 사용자의 홈 디렉토리입니다 (애플리케이션이 샌드 박스에없는 경우).

NSPathUtilities.h에서

NSApplicationDirectory = 1,             // supported applications (Applications)
    NSDemoApplicationDirectory,             // unsupported applications, demonstration versions (Demos)
    NSDeveloperApplicationDirectory,        // developer applications (Developer/Applications). DEPRECATED - there is no one single Developer directory.
    NSAdminApplicationDirectory,            // system and network administration applications (Administration)
    NSLibraryDirectory,                     // various documentation, support, and configuration files, resources (Library)
    NSDeveloperDirectory,                   // developer resources (Developer) DEPRECATED - there is no one single Developer directory.
    NSUserDirectory,                        // user home directories (Users)
    NSDocumentationDirectory,               // documentation (Documentation)
    NSDocumentDirectory,                    // documents (Documents)
    NSCoreServiceDirectory,                 // location of CoreServices directory (System/Library/CoreServices)
    NSAutosavedInformationDirectory NS_ENUM_AVAILABLE(10_6, 4_0) = 11,   // location of autosaved documents (Documents/Autosaved)
    NSDesktopDirectory = 12,                // location of user's desktop
    NSCachesDirectory = 13,                 // location of discardable cache files (Library/Caches)
    NSApplicationSupportDirectory = 14,     // location of application support files (plug-ins, etc) (Library/Application Support)
    NSDownloadsDirectory NS_ENUM_AVAILABLE(10_5, 2_0) = 15,              // location of the user's "Downloads" directory
    NSInputMethodsDirectory NS_ENUM_AVAILABLE(10_6, 4_0) = 16,           // input methods (Library/Input Methods)
    NSMoviesDirectory NS_ENUM_AVAILABLE(10_6, 4_0) = 17,                 // location of user's Movies directory (~/Movies)
    NSMusicDirectory NS_ENUM_AVAILABLE(10_6, 4_0) = 18,                  // location of user's Music directory (~/Music)
    NSPicturesDirectory NS_ENUM_AVAILABLE(10_6, 4_0) = 19,               // location of user's Pictures directory (~/Pictures)
    NSPrinterDescriptionDirectory NS_ENUM_AVAILABLE(10_6, 4_0) = 20,     // location of system's PPDs directory (Library/Printers/PPDs)
    NSSharedPublicDirectory NS_ENUM_AVAILABLE(10_6, 4_0) = 21,           // location of user's Public sharing directory (~/Public)
    NSPreferencePanesDirectory NS_ENUM_AVAILABLE(10_6, 4_0) = 22,        // location of the PreferencePanes directory for use with System Preferences (Library/PreferencePanes)
    NSApplicationScriptsDirectory NS_ENUM_AVAILABLE(10_8, NA) = 23,      // location of the user scripts folder for the calling application (~/Library/Application Scripts/code-signing-id)
    NSItemReplacementDirectory NS_ENUM_AVAILABLE(10_6, 4_0) = 99,       // For use with NSFileManager's URLForDirectory:inDomain:appropriateForURL:create:error:
    NSAllApplicationsDirectory = 100,       // all directories where applications can occur
    NSAllLibrariesDirectory = 101,          // all directories where resources can occur
    NSTrashDirectory NS_ENUM_AVAILABLE(10_8, NA) = 102                   // location of Trash directory

마지막으로 NSURL 카테고리 http://club15cc.com/code/ios/easy-ios-file-directory-paths-with-this-handy-nsurl-category의 몇 가지 편리한 방법


답변

전역 변수로 Swift 3 및 4 :

var documentsDirectory: URL {
    return FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last!
}

FileManager 확장자로 :

extension FileManager {
    static var documentsDirectory: URL {
        return `default`.urls(for: .documentDirectory, in: .userDomainMask).last!
    }

    var documentsDirectory: URL {
        return urls(for: .documentDirectory, in: .userDomainMask).last!
    }
}


답변

Documents폴더 외에도 iOS에서는 파일을 tempLibrary폴더에 저장할 수 있습니다 .

사용할 항목에 대한 자세한 내용은 설명서에서 다음 링크를 참조하십시오.


답변

이런 종류의 어색한 호출을 위해 FileManager에 확장자를 추가하는 것이 더 깔끔 할 수 있습니다. 다음과 같은 것 :

extension FileManager {
    static var documentDir : URL {
        return FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
    }
}


답변

이 코드를 사용하여 문서 디렉토리에 액세스 할 수 있으며 기본적으로 파일을 plist 형식으로 저장하는 데 사용됩니다.

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths firstObject];
return documentsDirectory;