NSFileManager's method createDirectoryAtPath returns false result on iOS

Borut Tomazin picture Borut Tomazin · Mar 6, 2013 · Viewed 7.1k times · Source

When I try to create a folder using the code bellow it returns NO with an error when I try to create a folder that already exists instead of returning YES:

[[NSFileManager defaultManager] createDirectoryAtPath:[documentsPath stringByAppendingPathComponent:@"temp"] withIntermediateDirectories:NO attributes:nil error:&error];

Apple's documentation says:

Return Value
YES if the directory was created or already exists or NO if an error occurred.

So I should get YES on success or if folder exists. But I get this message when folder exists:

Error Domain=NSCocoaErrorDomain Code=516 "The operation couldn’t be completed. (Cocoa error 516.)" UserInfo=0x200ef5f0 {NSFilePath=/var/mobile/Applications/DA657A0E-785D-49B4-9258-DF9EBAC5D52A/Documents/temp, NSUnderlyingError=0x200ef590 "The operation couldn’t be completed. File exists"}

Is this a bug and should be reported to Apple or am I doing something wrong?

Answer

trojanfoe picture trojanfoe · Mar 6, 2013

[NSFileManager createDirectoryAtPath:withIntermediateDirectories:attributes:error:] will fail if the file exists and it is not a directory.

So the way forward is to not bother creating the directory if it already exists and to throw an exception if it exists and is not a directory:

NSString *filename = [documentsPath stringByAppendingPathComponent:@"temp"];
NSFileManager *fileman = [NSFileManager defaultManager];
BOOL isDir = NO;
if (![fileman fileExistsAtPath:filename isDirectory:&isDir])
{
    // Create the directory
}
else if (!isDir)
{
    NSLog(@"Cannot proceed!");
    // Throw exception
}