objective-c cocoa directory

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



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.