ios - ¿Qué es el directorio de documentos(NSDocumentDirectory)?
(8)
Además de la carpeta Documents
, iOS también te permite guardar archivos en la temp
y carpetas de la Library
.
Para obtener más información sobre cuál usar, consulte este enlace desde la documentación:
¿Puede alguien explicarme qué es el directorio de documentos en una aplicación de iOS y cuándo usarlo?
Esto es lo que creo en este momento:
Para mí, parece ser una carpeta central donde el usuario puede almacenar los archivos necesarios para la aplicación.
¿Esta sería una ubicación diferente de donde Core Data almacena sus datos?
Parece que cada aplicación tiene su propio directorio de documentos.
¿Puedo crear un subdirectorio del directorio de documentos, como el directorio / imágenes de documentos o el directorio / videos de documentos?
Aquí hay una pequeña función útil, que hace que usar / crear carpetas de iOS sea un poco más fácil.
Le pasa el nombre de una subcarpeta, le devolverá la ruta completa y se asegurará de que el directorio exista.
(Personalmente, incluyo esta función estática en mi clase AppDelete, pero quizás este no es el lugar más inteligente para ponerlo).
Así es como lo llamaría, para obtener la "ruta completa" de un subdirectorio MySavedImages:
NSString* fullPath = [AppDelegate getFullPath:@"MySavedImages"];
Y aquí está la función completa:
+(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;
}
Con esta pequeña función, es fácil crear un directorio en el directorio de Documentos de su aplicación (si aún no existe) y escribir un archivo en él.
Así es como crearía el directorio y escribiría en él el contenido de uno de mis archivos de imagen:
// 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];
Espero que esto ayude !
Esto ha cambiado en iOS 8. Consulte la siguiente nota técnica: https://developer.apple.com/library/ios/technotes/tn2406/_index.html
La forma aprobada por Apple (del enlace de arriba) es la siguiente:
// Returns the URL to the application''s Documents directory.
- (NSURL *)applicationDocumentsDirectory
{
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
No pude encontrar el código en el documento sugerido por la respuesta aceptada pero encontré el equivalente actualizado aquí:
Guía de programación del sistema de archivos :: Acceso a archivos y directorios »
- (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;
}
Desalienta el uso de NSSearchPathForDirectoriesInDomain:
La función NSSearchPathForDirectoriesInDomains se comporta como el método URLsForDirectory: inDomains: pero devuelve la ubicación del directorio como una ruta basada en cadenas. En su lugar, debe usar el método URLsForDirectory: inDomains:
Aquí hay algunas otras constantes de directorio útiles para jugar. Sin duda, no todos estos son compatibles con iOS. También puede usar la función NSHomeDirectory () que:
En iOS, el directorio de inicio es el directorio de la zona de pruebas de la aplicación. En OS X, es el directorio de la zona de pruebas de la aplicación o el directorio de inicio del usuario actual (si la aplicación no está en una caja de arena)
De 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
Y finalmente, algunos métodos de conveniencia en una categoría de NSURL http://club15cc.com/code/ios/easy-ios-file-directory-paths-with-this-handy-nsurl-category
Puede acceder al directorio de documentos usando este código, básicamente se usa para almacenar archivos en formato plist:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths firstObject];
return documentsDirectory;
Puede ser más limpio agregar una extensión a FileManager para este tipo de llamadas incómodas, por orden, si nada más. Algo como:
extension FileManager {
static var documentDir : URL {
return FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
}
}
Su aplicación solamente (en un dispositivo sin jailbreak) se ejecuta en un entorno de "espacio aislado". Esto significa que solo puede acceder a archivos y directorios dentro de sus propios contenidos. Por ejemplo, documentos y biblioteca .
Consulte la Guía de programación de aplicaciones de iOS .
Para acceder al directorio de Documentos de su entorno limitado de aplicaciones, puede usar lo siguiente:
iOS 8 y más nuevo, este es el método recomendado
+ (NSURL *)applicationDocumentsDirectory
{
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
si necesita soportar iOS 7 o anterior
+ (NSString *) applicationDocumentsDirectory
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = paths.firstObject;
return basePath;
}
Este directorio de Documentos le permite almacenar archivos y subdirectorios que su aplicación crea o puede necesitar.
Para acceder a los archivos en el directorio de la biblioteca del uso de la zona de pruebas de su aplicación (en lugar de las paths
anteriores):
[NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0]
Swift 3 y 4 como var global:
var documentsDirectoryUrl: URL {
return FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last!
}