ios - poner - ¿Hay alguna manera más segura de crear un directorio si no existe?
poner contraseña fotos iphone (4)
En realidad, puede omitir el if
, aunque los documentos de Apple dicen que el directorio no debe existir, eso solo es cierto si está pasando withIntermediateDirectories:NO
Eso lo reduce a una sola llamada. El siguiente paso es capturar cualquier error:
NSError * error = nil;
[[NSFileManager defaultManager] createDirectoryAtPath:bundlePath
withIntermediateDirectories:YES
attributes:nil
error:&error];
if (error != nil) {
NSLog(@"error creating directory: %@", error);
//..
}
Esto no generará un error si el directorio ya existe.
He encontrado esta manera de crear un directorio si no existe. Pero parece un poco inestable y me temo que esto puede salir mal en 1 de cada 1000 intentos.
if(![[NSFileManager defaultManager] fileExistsAtPath:bundlePath]) {
[[NSFileManager defaultManager] createDirectoryAtPath:bundlePath withIntermediateDirectories:YES attributes:nil error:NULL];
}
Solo existe este incómodo método fileExistsAtPath que también busca archivos y no solo directorios. Pero para mí, lo peligroso es: ¿y si esto sale mal? ¿Qué debo hacer? ¿Cuál es la mejor práctica para garantizar que el directorio se crea y solo se crea cuando no existe?
Sé que las operaciones del sistema de archivos nunca son seguras. El dispositivo podría perder energía de la batería de forma repentina justo en el momento en que comenzó a palear los bits de A a B. O puede tropezar con un bit malo y colgarse por un segundo. Tal vez en raras ocasiones devuelve SÍ incluso si no hay directorio. En pocas palabras: no confío en las operaciones del sistema de archivos.
¿Cómo puedo hacer esto absolutamente seguro?
En swift 2 se ve así:
do {
try NSFileManager.defaultManager().createDirectoryAtPath(pathURL.absoluteString, withIntermediateDirectories: true, attributes: nil)
} catch {
print(error)
}
Para Swift 3.0
do {
try FileManager.default.createDirectory(atPath: folder, withIntermediateDirectories: true, attributes: nil)
} catch {
print(error)
}
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);
De un tema SO here .
Después de crear un directorio, puede vaciar el sistema de archivos y luego verificar si su directorio creado recientemente existe. Esto es probablemente excesivo, pero nunca se puede tener demasiado exceso.