ডকুমেন্ট ডিরেক্টরি (এনএসডোকামেন্ট ডিরেক্টরী) কী?


123

কোনও আইওএস অ্যাপে নথির ডিরেক্টরি কী এবং কখন এটি ব্যবহার করতে হবে তা আমাকে কেউ ব্যাখ্যা করতে পারেন?

আমি বর্তমানে যা বিশ্বাস করি তা এখানে:

আমার কাছে এটি একটি কেন্দ্রীয় ফোল্ডার বলে মনে হচ্ছে যেখানে ব্যবহারকারী অ্যাপটির জন্য প্রয়োজনীয় যে কোনও ফাইল সঞ্চয় করতে পারবেন।

কোর ডেটা এর ডেটা কোথায় সঞ্চয় করে তার চেয়ে আলাদা অবস্থান হবে?

দেখে মনে হচ্ছে প্রতিটি অ্যাপের নিজস্ব নথির ডিরেক্টরি পাওয়া যায় gets

আমি নথির ডিরেক্টরি, ডকুমেন্ট ডিরেক্টরি / ইমেজ, বা নথির ডিরেক্টরি / ভিডিওগুলির মতো একটি উপ-ডিরেক্টরি তৈরি করতে মুক্ত?


আইরিচ, এনএসডোকামেন্ট ডিরেক্টরীটি অ্যাপ কোর ডাটা হিসাবে একই পথে রয়েছে এবং প্রতিটি অ্যাপের নিজস্ব ডকুমেন্ট ডিরেক্টরি রয়েছে। এবং হ্যাঁ, আপনার অ্যাপ্লিকেশনটির জন্য আপনার প্রয়োজনীয় সংস্থানগুলি নিখরচায় রাখতে পারেন। যাইহোক, মনে হচ্ছে আপনার প্রশ্নটি এখনও শেষ হয়নি?
জেকেরিসৌজিন

আমি শুধু এখানে আপনার প্রশ্নের কিছু আমি মনে করি সম্পর্কিত পোস্ট stackoverflow.com/questions/5105250/... যদি এটা আপনার জন্য কাজ করে siee তা পরীক্ষা করুন।
Wytchkraft

গুগল থেকে যে কেউ আসছেন তাদের জন্য নোট করুন যে এটি আইওএস 8 এ পরিবর্তিত হয়েছে below নীচে আমার উত্তরটি দেখুন।
লিভটেক 12'15

এটি একই অবস্থান যেখানে আপনার স্ক্লাইট ফাইলটি সংরক্ষণ করা হয়েছে।
অনুরাগ ভাকুনি

উত্তর:


197

আপনার অ্যাপ্লিকেশনটি কেবলমাত্র (একটি জেলব্রোকড ডিভাইসে) "স্যান্ডবক্সযুক্ত" পরিবেশে চলে। এর অর্থ এটি কেবল নিজের সামগ্রীতে ফাইল এবং ডিরেক্টরিগুলি অ্যাক্সেস করতে পারে। উদাহরণস্বরূপ নথি এবং গ্রন্থাগার

দেখুন আইওএস এপ্লিকেশন প্রোগ্রামিং গাইড

আপনার অ্যাপ্লিকেশন স্যান্ডবক্সের দস্তাবেজ ডিরেক্টরি অ্যাক্সেস করতে, আপনি নিম্নলিখিত ব্যবহার করতে পারেন:

আইওএস 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;
}

এই দস্তাবেজ ডিরেক্টরি আপনাকে আপনার অ্যাপ্লিকেশন তৈরি করতে পারে বা প্রয়োজন হতে পারে এমন ফাইল এবং উপ-ডিরেক্টরিগুলি সংরক্ষণ করার অনুমতি দেয়।

আপনার অ্যাপ্লিকেশন স্যান্ডবক্স ব্যবহারের লাইব্রেরি ডিরেক্টরিতে ফাইল অ্যাক্সেস করতে ( pathsউপরের স্থানে ):

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

13
আমি আবিষ্কার করেছি যে [@ "~ / ডকুমেন্টস" স্ট্রিংবাই এক্সপান্ডিং টিলডিআইএনপথ] একই কাজ করে। এটির নিরুৎসাহিত করার কোনও কারণ আছে কি?
চতুটু

35
আমি @ "~ / ডকুমেন্টস" দিয়ে এই পদ্ধতির ব্যবহার করব না। হার্ডকোডিং পাথগুলি কখনও ভাল ধারণা নয়। এটি এখনই কাজ করতে পারে তবে অ্যাপল যদি ডকুমেন্টস ডিরেক্টরিটি পুনরায় নামকরণ বা সরানো বেছে নেয় তবে আপনার অ্যাপ্লিকেশনটি ভেঙে যাবে। NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);আপনাকে সর্বদা সঠিক ডিরেক্টরি দেবে!

16
আপনার এখনও সরবরাহিত এপিআই ব্যবহার করা উচিত। সে কারণেই ওখানে! আপনি এখনও অবধি ভাগ্যবান।
নিলসবট

20
প্রতিবার এটি ব্যবহার করার সময় আমাকে কীভাবে গুগল করতে হবে তা হাসিখুশি। আমি মনে করি সমস্ত মোবাইল প্ল্যাটফর্মগুলি হোম / লিখনযোগ্য ডিরেক্টরিতে ডিফল্ট গ্লোবাল প্যারামিটার সরবরাহ করা উচিত
রবীন্দ্রনাথ আকিলা

1
অ্যাপ্লিকেশনগুলির ফোল্ডারে লেখার ক্ষমতা সম্পর্কে তথ্যের সাথে আপডেট হওয়া লিঙ্ক: বিকাশকারী
লাইব্রেরি

43

এটি আইওএস-এ পরিবর্তিত হয়েছে 8 নিম্নলিখিত প্রযুক্তিগত নোটটি দেখুন: https://developer.apple.com/library/ios/technotes/tn2406/_index.html

অ্যাপল অনুমোদিত উপায় (উপরের লিঙ্ক থেকে) নিম্নরূপ:

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

7
এই উত্তর আপনি চান! বছরটি এখন প্রায় 2016। পুরানো উত্তর সহ এটি একটি জনপ্রিয় প্রশ্ন।
জেফ

ডকুমেন্ট ডিরেক্টরিটির পথ পুনরুদ্ধার করতে কি আমি উপরের পদ্ধতিটি ব্যবহার করতে পারি? url.path এর মত?
আবুজার আমিন

21

আমি স্বীকৃত উত্তরের প্রস্তাবিত দস্তাবেজে কোডটি খুঁজে পাইনি তবে আমি এখানে আপডেট সমতুল্য পেয়েছি:

ফাইল সিস্টেম প্রোগ্রামিং গাইড :: ফাইল এবং ডিরেক্টরি Access

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

এটি এনএসএস সার্চপথফোর্ড ডিরেক্টরী ইনডোমাইন ব্যবহারকে নিরুৎসাহিত করে:

এনএসএস সার্চপথফোর্ডডাইরেক্টরিআইডোমাইনস ফাংশনটি ইউআরএলস ফোরডাইরেক্টরির মতো আচরণ করে: ইনডমাইনস: পদ্ধতি তবে ডিরেক্টরিটির স্ট্রিং-ভিত্তিক পথ হিসাবে স্থান দেয় returns পরিবর্তে আপনার URL টির জন্য ডিরেক্টরি: ইনডমাইনস: পদ্ধতি ব্যবহার করা উচিত।

এখানে খেলতে আরও কিছু দরকারী ডিরেক্টরি ধ্রুবক রয়েছে। কোনও সন্দেহ নেই যে এই সমস্তগুলি iOS এ সমর্থিত নয়। এছাড়াও আপনি এনএসহোমডাইরেক্টরি () ফাংশনটি ব্যবহার করতে পারেন যা:

আইওএস-এ, হোম ডিরেক্টরিটি হ'ল অ্যাপ্লিকেশনটির স্যান্ডবক্স ডিরেক্টরি। ওএস এক্সে এটি হ'ল অ্যাপ্লিকেশনটির স্যান্ডবক্স ডিরেক্টরি বা বর্তমান ব্যবহারকারীর হোম ডিরেক্টরি (যদি অ্যাপ্লিকেশনটি স্যান্ডবক্সে না থাকে)

এনএসপ্যাথ ইউটিলিটিস থেকে

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

এবং পরিশেষে, একটি এনএসআরএল বিভাগে কিছু সুবিধা পদ্ধতি http://club15cc.com/code/ios/easy-ios-file-directory-paths-with-thith-handy-nsurl-category


8

গ্লোবাল ভার হিসাবে সুইফট 3 এবং 4

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

ফাইল ম্যানেজার এক্সটেনশন হিসাবে:

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

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

ধন্যবাদ। আমি সবসময় এটি ভুলে যাই :) আপনি যদি এপিআই নকশা নির্দেশিকা ধরে রাখতে চান তবে আপনি এটির নাম দিতে পারেন documentDirectoryURLবা কেবল documentDirectoryএবং টাইপের উপর নির্ভর করতে পারেন। আমি এটি FileManagerকোনও স্ট্র্যাটেস্টিক স্থিতিশীল সম্পত্তি হিসাবে কোনও এক্সটেনশনে স্থিতিশীলভাবে স্কোপিংয়ের ধারণাটি পছন্দ করি ।
রে ফিক্স

1
ধন্যবাদ @ রায়ফিক্স, আপনার উত্তর দিয়ে আমার উত্তর আপডেট করেছেন!
আন্তন প্ল্লেবানোভিচ

6

Documentsফোল্ডারটি বাদ দিয়ে , আইওএস আপনাকে ফাইল tempএবং Libraryফোল্ডারে ফাইলগুলি সংরক্ষণ করতে দেয় ।

কোনটি ব্যবহার করবেন সে সম্পর্কে আরও তথ্যের জন্য ডকুমেন্টেশন থেকে এই লিঙ্কটি দেখুন:


6

এই জাতীয় বিশ্রী কলটির জন্য ফাইলম্যানেজারে কোনও এক্সটেনশন যুক্ত করা ক্লিনার হতে পারে, অন্য কিছু না থাকলে পরিশুদ্ধির জন্য। কিছুটা এইরকম:

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

4

আপনি এই কোডটি ব্যবহার করে দস্তাবেজ ডিরেক্টরিতে অ্যাক্সেস করতে পারেন এটি মূলত প্লিস্ট ফর্ম্যাটে ফাইল সংরক্ষণের জন্য ব্যবহৃত হয়:

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

এই একই উত্তরটি রাইটসিসিএস 3 বছর আগে দিয়েছিল। এছাড়াও, 2014 সালে এই উত্তর দেওয়া অদ্ভুত বিবেচনা করে অ্যাপলকে লাইভটেকের উত্তরের পদ্ধতির পরামর্শ দেয়।
জেফ

আপনি যদি ভাবেন যে আমি ভোটকে বাতিল করতে ভুল, তবে দয়া করে কেন তা ব্যাখ্যা করুন। আমার যে কোনও একটি প্রশ্নের প্রতিশোধ নেওয়ার ভোটটি বাচ্চার। শীর্ষস্থানীয় সেরা উত্তরগুলি ঠেলে দেওয়ার বিষয়ে এটি এই সাইটটি।
জেফ

@ জেফ আপনাকে নির্দেশ দেওয়ার জন্য ধন্যবাদ জানালেন, কিছু গবেষণা করেছেন এবং আপনি ঠিক বলেছেন। নতুন সমাধান: - (এনএসআরএল *) অ্যাপ্লিকেশন ডকুমেন্টস ডিরেক্টরী {রিটার্ন [[[এনএসফাইলম্যানেজার ডিফল্ট ম্যানেজার] ইউআরএলস জন্য ডিরেক্টরি: এনএসডোকামেন্টডাইরেক্টরি ইনডোমাইনস: এনএসউজারডোমাইনমাস্ক] লাস্টঅবজেক্ট]; }
সুমিত ওবেরয়

1

এখানে একটি দরকারী সামান্য ফাংশন, যা আইওএস ফোল্ডারগুলি ব্যবহার / তৈরি করা একটু সহজ করে তোলে।

আপনি এটি একটি সাবফোল্ডারের নামটি পাস করেছেন, এটি আপনাকে পুরো পথটি ফিরিয়ে দেবে এবং ডিরেক্টরিটি বিদ্যমান রয়েছে তা নিশ্চিত করে নিন।

(ব্যক্তিগতভাবে, আমি আমার অ্যাপডিলেট ক্লাসে এই স্থিতিশীল ফাংশনটি আঁকছি, তবে সম্ভবত এটি এটি দেওয়ার জন্য সবচেয়ে স্মার্ট জায়গা নয়))

মাইসেভেডআইমেজ সাব-ডিরেক্টরিতে "সম্পূর্ণ পথ" পেতে আপনি এখানে এটি কীভাবে ডাকবেন তা এখানে:

NSString* fullPath = [AppDelegate getFullPath:@"MySavedImages"];

এবং এখানে সম্পূর্ণ ফাংশন:

+(NSString*)getFullPath:(NSString*)folderName
{
    //  Check whether a subdirectory exists in our sandboxed Documents directory.
    //  Returns the full path of the directory.
    //
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    if (paths.count < 1)
        return nil;

    NSString *rootFolder = [paths firstObject];
    NSString* fullFolderPath = [rootFolder stringByAppendingPathComponent:folderName];

    BOOL isDirectory;
    NSFileManager* manager = [NSFileManager defaultManager];

    if (![manager fileExistsAtPath:fullFolderPath isDirectory:&isDirectory] || !isDirectory) {
        NSError *error = nil;
        NSDictionary *attr = [NSDictionary dictionaryWithObject:NSFileProtectionComplete
                                                         forKey:NSFileProtectionKey];
        [manager createDirectoryAtPath:fullFolderPath
           withIntermediateDirectories:YES
                            attributes:attr
                                 error:&error];
        if (error) {
            NSLog(@"Error creating directory path: %@", [error localizedDescription]);
            return nil;
        }
    }
    return fullFolderPath;
}

এই সামান্য ফাংশনটি ব্যবহার করে, আপনার অ্যাপ্লিকেশনটির নথি ডিরেক্টরিতে ডিরেক্টরি তৈরি করা (এটি যদি ইতিমধ্যে বিদ্যমান না থাকে) এবং এতে একটি ফাইল লিখতে সহজ।

আমি কীভাবে ডিরেক্টরিটি তৈরি করব এবং এতে আমার একটি চিত্র ফাইলের বিষয়বস্তু লিখব তা এখানে:

//  Let's create a "MySavedImages" subdirectory (if it doesn't already exist)
NSString* fullPath = [AppDelegate getFullPath:@"MySavedImages"];

//  As an example, let's load the data in one of my images files
NSString* imageFilename = @"icnCross.png";

UIImage* image = [UIImage imageNamed:imageFilename];
NSData *imageData = UIImagePNGRepresentation(image);

//  Obtain the full path+filename where we can write this .png to, in our new MySavedImages directory
NSString* imageFilePathname = [fullPath stringByAppendingPathComponent:imageFilename];

//  Write the data
[imageData writeToFile:imageFilePathname atomically:YES];

আশাকরি এটা সাহায্য করবে !


0

উল্লিখিত অন্যদের মতো, আপনার অ্যাপটি স্যান্ডবক্সযুক্ত পরিবেশে চলে এবং আপনি নিজের অ্যাপ্লিকেশন ব্যবহার করতে পারেন এমন চিত্র বা অন্যান্য সম্পদ সংরক্ষণের জন্য ডকুমেন্ট ডিরেক্টরি ব্যবহার করতে পারেন। ব্যবহারকারী পছন্দ হিসাবে অফলাইন-ডি ফাইল ডাউনলোড করা - ফাইল সিস্টেম বেসিকস - অ্যাপল ডকুমেন্টেশন - অ্যাপ্লিকেশন নির্দিষ্ট ফাইলগুলি সংরক্ষণ করার জন্য কোন ডিরেক্টরিটি ব্যবহার করতে হবে

সুইফট 5 এ আপডেট হয়েছে, আপনি প্রয়োজন অনুযায়ী এই ফাংশনগুলির একটি ব্যবহার করতে পারেন -

func getDocumentsDirectory() -> URL {
    let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
    return paths[0]
}

func getCacheDirectory() -> URL {
        let paths = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask)
        return paths[0]
    }

func getApplicationSupportDirectory() -> URL {
        let paths = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask)
        return paths[0]
    }

ব্যবহার:

let urlPath = "https://jumpcloud.com/wp-content/uploads/2017/06/SSH-Keys.png" //Or string path to some URL of valid image, for eg.

if let url = URL(string: urlPath){
    let destination = getDocumentsDirectory().appendingPathComponent(url.lastPathComponent)
    do {
        let data = try Data(contentsOf: url) //Synchronous call, just as an example
        try data.write(to: destination)
    } catch _ {
        //Do something to handle the error
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.