objective c - Crear carpeta/directorio en Objective-C/cocoa
directory (4)
Aproximadamente 30 segundos en la documentación encontrada:
-[NSFileManager createDirectoryAtPath:withIntermediateDirectories:attributes:error:]
Tengo este código para crear una carpeta / directorio en Objective-C / cocoa.
if(![fileManager fileExistsAtPath:directory isDirectory:&isDir])
if(![fileManager createDirectoryAtPath:directory attributes:nil])
NSLog(@"Error: Create folder failed %@", directory);
Funciona bien, pero tengo creatDirectoryAtPath:attributes is deprecated
un mensaje de advertencia creatDirectoryAtPath:attributes is deprecated
. ¿Cuál es la forma más nueva de crear un generador de directorios en Cocoa / Objective-c?
SOLUCIONADO
BOOL isDir;
NSFileManager *fileManager= [NSFileManager defaultManager];
if(![fileManager fileExistsAtPath:directory isDirectory:&isDir])
if(![fileManager createDirectoryAtPath:directory withIntermediateDirectories:YES attributes:nil error:NULL])
NSLog(@"Error: Create folder failed %@", directory);
Es posible que prefiera trabajar con el método NSFileManager
:
createDirectoryAtURL:withIntermediateDirectories:attributes:error:
Funciona con URL en lugar de cadenas de ruta.
Pensé que agregaría esto y mencionaría algo más de la documentación sobre el uso del método + defaultManager:
En iOS y Mac OS X v 10.5 y posterior, debería considerar usar [[NSFileManager alloc] init] en lugar del método singleton defaultManager. Las instancias de NSFileManager se consideran seguras para subprocesos cuando se crean con [[NSFileManager alloc] init].
Su solución es correcta, aunque Apple incluye una nota importante en NSFileManager.h
:
/* The following methods are of limited utility. Attempting to predicate behavior
based on the current state of the filesystem or a particular file on the
filesystem is encouraging odd behavior in the face of filesystem race conditions.
It''s far better to attempt an operation (like loading a file or creating a
directory) and handle the error gracefully than it is to try to figure out ahead
of time whether the operation will succeed. */
- (BOOL)fileExistsAtPath:(NSString *)path;
- (BOOL)fileExistsAtPath:(NSString *)path isDirectory:(BOOL *)isDirectory;
- (BOOL)isReadableFileAtPath:(NSString *)path;
- (BOOL)isWritableFileAtPath:(NSString *)path;
- (BOOL)isExecutableFileAtPath:(NSString *)path;
- (BOOL)isDeletableFileAtPath:(NSString *)path;
Básicamente, si hay varios subprocesos / procesos modificando el sistema de archivos simultáneamente, el estado podría cambiar entre invocar fileExistsAtPath:isDirectory:
y llamar a createDirectoryAtPath:withIntermediateDirectories:
así que es superfluo y posiblemente peligroso llamar a fileExistsAtPath:isDirectory:
en este contexto.
Para sus necesidades y dentro del alcance limitado de su pregunta, probablemente no sea un problema, pero la siguiente solución es más simple y ofrece menos posibilidades de que surjan problemas en el futuro:
NSFileManager *fileManager= [NSFileManager defaultManager];
NSError *error = nil;
if(![fileManager createDirectoryAtPath:directory withIntermediateDirectories:YES attributes:nil error:&error]) {
// An error has occurred, do something to handle it
NSLog(@"Failed to create directory /"%@/". Error: %@", directory, error);
}
También tenga en cuenta de la documentación de Apple :
Valor de retorno
SÍ si se creó el directorio, SÍ si se establece createIntermediates y el directorio ya existe), o NO si se produjo un error.
Entonces, establecer createIntermediates
en YES
, que ya se hace, es una verificación de facto de si el directorio ya existe.