Существует ли более безопасный способ создания каталога, если он не существует?

Я нашел этот способ создания каталога, если он не существует. Но это выглядит немного неудобно, и я боюсь, что это может пойти не так в 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)
}