Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can you tell if a directory is writeable in Objective-C?

I want to use an open panel to let the user select a destination, but I want to alert them at that point that point that the directory is not-writable. I generally prefer to create it and handle the error, but that's not useful to me here, since I don't want to create the folder just yet. (I'll be sure to handle the error when I do create it, if there is one.)

I thought there might be a better way than to just create it and delete it, which would stink.

I tried doing this, thinking that "file" might mean file or directory like some other methods.

NSFileManager *fm = [NSFileManager defaultManager];
[fm isWritableFileAtPath:destinationString]

(I'm not sure yet if I want to offer the chance to authenticate to override permissions, but feel free to tell me how.)

like image 699
zekel Avatar asked Oct 20 '09 22:10

zekel


2 Answers

Edit: Looks like inkjet figured out why I was getting inconsistent results. Marking his as the correct answer.


Weird. I tried isWriteableAtPath before and it didn't seem to work as I expected, but now with an isolated test does.

NSFileManager *fm = [NSFileManager defaultManager];
NSLog(@"%d /private/ writeable?", [fm isWritableFileAtPath:@"/private/"]);
NSLog(@"%d /Applications/ writeable?", [fm isWritableFileAtPath:@"/Applications/"]);
NSLog(@"%d /Users/MYUSERNAME/ writeable?", [fm isWritableFileAtPath:@"/Users/MYUSERNAME/"]);

Prints

0 /private/ writeable?
1 /Applications/ writeable?
1 /Users/MYUSERNAME/ writeable?
like image 61
zekel Avatar answered Nov 13 '22 11:11

zekel


A directory's path ends with "/". Assuming your code is:

NSString* destinationString = [[panel URL] path];
[fm isWritableFileAtPath:destinationString];

You'll end up with a destinationString that does not end with "/", therefore isWritableFileAtPath: will be testing the possibility of writing to a file named "someDir" instead of the folder "someDir".

A quick fix would be to do this:

NSString* destinationString = [[panel URL] path];

if (![destinationString hasSuffix:@"/"])
    destinationString = [destinationString stringByAppendingString:@"/"];

[fm isWritableFileAtPath:destinationString];
like image 45
inket Avatar answered Nov 13 '22 11:11

inket