iphone objective-c cocoa-touch nsfilemanager

iphone - Cómo comprobar si existe un directorio en Objective-C



cocoa-touch nsfilemanager (3)

Supongo que este es un problema de principiante, pero estaba intentando verificar si existe un directorio en mi carpeta Documentos en el iPhone. Leí la documentación y encontré este código que desafortunadamente se estrelló con EXC_BAD_ACCESS en la línea de archivos BOOL Exist:

-(void)checkIfDirectoryAlreadyExists:(NSString *)name { NSFileManager *fileManager = [[NSFileManager alloc] init]; NSString *path = [[self documentsDirectory] stringByAppendingPathComponent:name]; BOOL fileExists = [fileManager fileExistsAtPath:path isDirectory:YES]; if (fileExists) { NSLog(@"Folder already exists..."); } }

¿No entiendo lo que he hecho mal? A mí me parece perfecto y ciertamente cumple con los documentos, ¿no? ¡Cualquier revelación sobre dónde me equivoqué sería muy apreciada! Gracias.

ACTUALIZADO:

Sigue sin funcionar...

-(void)checkIfDirectoryAlreadyExists:(NSString *)name { NSFileManager *fileManager = [[NSFileManager alloc] init]; NSString *path = [[self documentsDirectory] stringByAppendingPathComponent:name]; BOOL isDir; BOOL fileExists = [fileManager fileExistsAtPath:path isDirectory:&isDir]; if (fileExists) { if (isDir) { NSLog(@"Folder already exists..."); } } }


Eche un vistazo en la documentation de la firma de este método:

- (BOOL)fileExistsAtPath:(NSString *)path isDirectory:(BOOL *)isDirectory

Necesita un puntero a una var de BOOL como argumento, no un BOOL en sí. NSFileManager registrará si el archivo es un directorio o no en esa variable. Por ejemplo:

BOOL isDir; BOOL exists = [fm fileExistsAtPath:path isDirectory:&isDir]; if (exists) { /* file exists */ if (isDir) { /* file is a directory */ } }


En caso de que alguien necesite un captador, eso crea una carpeta en Documentos, si no existe:

- (NSString *)folderPath { if (! _folderPath) { NSString *folderName = @"YourFolderName"; NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectoryPath = [documentPaths objectAtIndex:0]; _folderPath = [documentsDirectoryPath stringByAppendingPathComponent:folderName]; // if folder doesn''t exist, create it NSError *error = nil; NSFileManager *fileManager = [NSFileManager defaultManager]; BOOL isDir; if (! [fileManager fileExistsAtPath:_folderPath isDirectory:&isDir]) { BOOL success = [fileManager createDirectoryAtPath:_folderPath withIntermediateDirectories:NO attributes:nil error:&error]; if (!success || error) { NSLog(@"Error: %@", [error localizedDescription]); } NSAssert(success, @"Failed to create folder at path:%@", _folderPath); } } return _folderPath; }


Tengo una clase Singleton de utilidad que uso para cosas como esta. Como no puedo actualizar mi base de datos si permanece en Documentos, copio mis archivos .sqlite de Documentos a / Biblioteca / Documentos privados usando este código. El primer método encuentra la biblioteca. El segundo crea la carpeta Documentos privados si no existe y devuelve la ubicación como una cadena. El segundo método utiliza el mismo método de administrador de archivos que @wzboson.

+ (NSString *)applicationLibraryDirectory { return [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject]; } + (NSString *)applicationLibraryPrivateDocumentsDirectory { NSError *error; NSString *PrivateDocumentsDirectory = [[self applicationLibraryDirectory] stringByAppendingPathComponent:@"Private Documents"]; BOOL isDir; if (! [[NSFileManager defaultManager] fileExistsAtPath:PrivateDocumentsDirectory isDirectory:&isDir]) { if (![[NSFileManager defaultManager] createDirectoryAtPath:PrivateDocumentsDirectory withIntermediateDirectories:NO attributes:nil error:&error]) { NSLog(@"Create directory error: %@", error); } } return PrivateDocumentsDirectory; }

Lo uso así en mi inicialización de coordinador de tienda persistente. El mismo principio se aplica a cualquier archivo sin embargo.

NSString *libraryDirectory = [Utilities applicationLibraryPrivateDocumentsDirectory]; NSString *sourcePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:sqliteName]; NSString *destinationPath = [libraryDirectory stringByAppendingPathComponent:sqliteName];