2010-07-26 2 views
4

Я работаю над новой функцией для существующего приложения iPhone и хотел бы создать несколько новых каталогов в локальной папке «Документы» приложения. Я успешно сделал это с помощью рекомендованного метода:Неверное возвращаемое значение с использованием NSFileManager createDirectoryAtPath:

[NSFileManager createDirectoryAtPath:withIntermediateDirectories:attributes:error:] 

При чтении документации по этому методу, я был заинтригован возвращаемые значения, перечисленные в официальном documentation Apple:

Возвращаемое значение: ДА, если операция прошла успешно или уже существует, в противном случае NO

Каждый раз, когда мое приложение запускается, я хотел бы чтобы убедиться, что каталоги правильно установлены. Я подумал, что разумным способом сделать это будет вызов метода createDirectory: при каждом запуске и использование возвращаемого значения метода. Если по какой-либо причине каталог отсутствовал, он будет создан. Если каталог уже был на месте, возвращаемое значение все равно будет YES. A NO Возвращаемое значение затем может использоваться как флаг для дополнительной логики восстановления/восстановления.

К сожалению, я, кажется, получаю результаты, не соответствующие документации Apple. Метод возвращает NO, если каталог уже существует - когда документы Apple говорят, что он должен вернуть ДА в этом случае.

Следующая программа демонстрирует это поведение:

#import <Foundation/Foundation.h> 

int main (int argc, const char * argv[]) { 

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

NSFileManager * fm = [NSFileManager defaultManager]; 
bool testDirectoryCreated = NO; 

testDirectoryCreated = [[NSFileManager defaultManager]createDirectoryAtPath: [NSString stringWithFormat:@"%@/%@",[fm currentDirectoryPath],@"TestDirectory"] 
               withIntermediateDirectories: NO 
                   attributes: nil 
                     error: NULL]; 

NSLog(@"TestDirectory Created: %@\n", (testDirectoryCreated ? @"YES" : @"NO")); 

testDirectoryCreated = [[NSFileManager defaultManager]createDirectoryAtPath: [NSString stringWithFormat:@"%@/%@",[fm currentDirectoryPath],@"TestDirectory"] 
               withIntermediateDirectories: NO 
                   attributes: nil 
                     error: NULL]; 

NSLog(@"TestDirectory Created: %@\n", (testDirectoryCreated ? @"YES" : @"NO")); 

[pool drain]; 

return 0; 

}

Когда программа выполняется, она будет печатать ДА на первом createDirectory: вызов, а НЕТ на второй вызов - когда «TestDirectory» уже существует.

Это ошибка в документации Apple, или я что-то упускаю?

Кроме того, любые другие идеи только для проверки целостности моей структуры каталогов? Есть ли простой метод «directory exists», который я могу назвать?

Спасибо,

Том

ответ

4

Если вы хотите получить удобство, чтобы проверить, существует ли каталог с этим методом, вы должны передать TRUE параметру withIntermediateDirectories :.

Об этом говорится в документации компании Apple

Кроме того, если вы передаете NO для этого параметра, каталог не должен существовать в то время этот вызов сделан.

+0

Нечетный, моя документация гласит: «Если ДА, этот метод создает любые несуществующие родительские каталоги как часть создания каталога в URL-адресе. Если НЕТ, этот метод терпит неудачу, если какой-либо из промежуточных родительских каталогов не существует. если какой-либо из промежуточных элементов пути соответствует файлу, а не каталогу ». - Заставляет меня думать, что это формулировка от createDirectoryAtURL: - отличается ли поведение? – GTAE86

1

Это кажется странным, что возвращаемое значение будет ДА, если каталог уже существует. Я бы ожидал, что это значение возвращается только для отражения успеха при создании каталога. Который будет соответствовать вашим доходам.

Что касается другого вопроса, вы можете посмотреть на fileExistsAtPath: и fileExistsAtPath: isDirectory: под NSFileManager.

+0

Да, кажется странным, что метод вернет да в случае «уже существует», но это казалось удобным для того, что я делал. Документация Apple, кажется, противоречит самой себе - ранее в описании метода она заявляет, что путь, по которому вы создаете каталог, еще не существует, но его описание возвращаемых значений, как представляется, указывает на другое. Спасибо за другие предложения! – thauburger

Смежные вопросы