Что такое каталог документов (NSDocumentDirectory)?
может кто-нибудь объяснить мне, что каталог документов находится в приложении iOS и когда его использовать?
вот во что я верю в настоящее время:
Мне кажется, что это центральная папка, в которой пользователь может хранить любые файлы, необходимые для приложения.
Это будет другое место, чем где Core Data хранит свои данные?
кажется, что каждое приложение получает свой собственный каталог документов.
Я могу создать подкаталог каталог документов, например каталог документов / изображений или каталог документов/видео?
8 ответов
ваше приложение только (на устройстве без джейлбрейка) работает в "изолированной" среде. Это означает, что он может получить доступ только к файлам и каталогам в своем собственном содержимом. Например документы и библиотека.
посмотреть руководство по программированию приложений iOS.
к документы каталог ваших приложений sandbox, вы можете использовать следующее:
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;
}
этой документы позволяет хранить файлы и подкаталоги ваше приложение создает или может понадобиться.
для доступа к файлам в библиотека каталог ваших приложений использование песочницы (вместо 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:
var documentsDirectoryUrl: URL {
return FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last!
}
помимо Documents
папка, iOS также позволяет сохранять файлы в temp
и Library
папки.
для получения дополнительной информации о том, какой из них использовать, см. Эту ссылку из документации:
может быть чище добавить расширение в 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;
вот полезная небольшая функция, которая делает использование/создание папок iOS немного проще.
вы передаете ему имя подпапки, он вернет вам полный путь и убедитесь, что каталог существует.
(лично я вставляю эту статическую функцию в свой класс AppDelete, но, возможно, это не самое умное место для ее размещения.)
вот как вы бы это назвали, чтобы получить "полный путь" подкаталога MySavedImages:
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];
надеюсь, что это помогает !