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];