Создать папку / каталог в Objective-C / какао - PullRequest
44 голосов
/ 28 февраля 2011

У меня есть этот код для создания папки / каталога в Objective-C / cocoa.

if(![fileManager fileExistsAtPath:directory isDirectory:&isDir])
        if(![fileManager createDirectoryAtPath:directory attributes:nil])
            NSLog(@"Error: Create folder failed %@", directory);

Работает нормально, но я получил creatDirectoryAtPath:attributes is deprecated предупреждение. Каков новый способ создания компоновщика каталогов в Cocoa / Objective-c?

решаемые

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

Ответы [ 4 ]

53 голосов
/ 28 февраля 2011

В документации найдено около 30 секунд:

-[NSFileManager createDirectoryAtPath:withIntermediateDirectories:attributes:error:]

18 голосов
/ 07 июля 2013

Ваше решение правильное, хотя Apple включает важное примечание в 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;

По существу, если несколько потоков / процессов изменяют файловую систему одновременно, состояние может измениться между вызовом fileExistsAtPath:isDirectory: и вызовом createDirectoryAtPath:withIntermediateDirectories:, поэтому в этом контексте излишне и, возможно, опасно вызывать fileExistsAtPath:isDirectory:.

Для ваших нужд и в рамках ограниченного объема вашего вопроса это, скорее всего, не будет проблемой, но следующее решение и проще, и дает меньше шансов на возникновение будущих проблем:

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

Также обратите внимание на Документация Apple :

Возвращаемое значение

ДА, если каталог был создан, ДА, если задано createIntermediates и каталог уже существует), или НЕТ, если произошла ошибка.

Итак, установка createIntermediates в YES, что вы уже делаете, является де-факто проверкой того, существует ли каталог.

3 голосов
/ 14 апреля 2011

Я хотел бы добавить к этому и упомянуть еще кое-что из документации об использовании метода + defaultManager:

В iOS и Mac OS X v 10.5 и более поздних версиях вам следует рассмотреть возможность использования [[NSFileManageralloc] init], а не одноэлементный метод defaultManager.Экземпляры NSFileManager считаются поточно-ориентированными при создании с помощью [[NSFileManager alloc] init].

2 голосов
/ 30 октября 2012

Вы можете предпочесть работать с методом NSFileManager:

createDirectoryAtURL:withIntermediateDirectories:attributes:error:

Работает с URL вместо строк пути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...