Существует ли более безопасный способ создания каталога, если он не существует?
Я нашел этот способ создания каталога, если он не существует. Но это выглядит немного неудобно, и я боюсь, что это может пойти не так в 1 из 1000 попыток.
if(![[NSFileManager defaultManager] fileExistsAtPath:bundlePath]) {
[[NSFileManager defaultManager] createDirectoryAtPath:bundlePath withIntermediateDirectories:YES attributes:nil error:NULL];
}
Существует только этот неудобный метод fileExistsAtPath, который также ищет файлы, а не только каталоги. Но для меня опасная вещь: что, если это пойдет не так? Что мне делать? Что лучше всего гарантировать, что каталог создан и создан только тогда, когда он не существует?
Я знаю, что операции с файловой системой никогда не будут безопасными. Устройство может внезапно разрядиться от батареи сразу же в тот момент, когда он начал лопать биты от А до Б. Или он может наткнуться на плохой бит и повесить на секунду. Возможно, в некоторых случаях он возвращает ДА, даже если нет каталога. Проще говоря: я не доверяю действиям файловой системы.
Как я могу сделать это абсолютно безопасным?
Ответы
Ответ 1
Фактически вы можете пропустить if
, хотя документы Apple говорят, что каталог не должен существовать, это верно только в том случае, если вы проходите withIntermediateDirectories:NO
Это ставит его на один вызов. Следующим шагом будет захват любых ошибок:
NSError * error = nil;
[[NSFileManager defaultManager] createDirectoryAtPath:bundlePath
withIntermediateDirectories:YES
attributes:nil
error:&error];
if (error != nil) {
NSLog(@"error creating directory: %@", error);
//..
}
Это не приведет к ошибке, если каталог уже существует.
Ответ 2
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);
Из SO-темы здесь.
После создания каталога вы можете очистить файловую систему и проверить, существует ли ваш новый созданный каталог. Это, вероятно, слишком много, но у вас никогда не будет слишком много переполнения.
Ответ 3
Для Swift 3.0
do {
try FileManager.default.createDirectory(atPath: folder, withIntermediateDirectories: true, attributes: nil)
} catch {
print(error)
}
Ответ 4
В swift 2 это выглядит так:
do {
try NSFileManager.defaultManager().createDirectoryAtPath(pathURL.absoluteString, withIntermediateDirectories: true, attributes: nil)
} catch {
print(error)
}