Search code examples
xcodepermissionsnsdictionarynsfilemanagerchmod

NSFileManager & NSFilePosixPermissions


I want to use the octal permissions (used for chmod) for NSFilePosixPermissions. Here is what I did now:

NSFileManager *manager = [NSFileManager defaultManager];
NSDictionary *attributes;

[attributes setValue:[NSString stringWithFormat:@"%d", 0777] 
             forKey:@"NSFilePosixPermissions"]; // chmod permissions 777
[manager setAttributes:attributes ofItemAtPath:@"/Users/lucky/Desktop/script" error:nil];

I get no error, but when I check the result with "ls -o" the permission are't -rwxrwxrwx.

What's wrong? Thanks for help.


Solution

  • First, NSFilePosixPermissions is the name of a constant. Its value may also be the same, but that’s not guaranteed. The value of the NSFilePosixPermissions constant could change between framework releases, e. g. from @"NSFilePosixPermissions" to @"posixPermisions". This would break your code. The right way is to use the constant as NSFilePosixPermissions, not @"NSFilePosixPermissions".

    Also, the NSFilePosixPermissions reference says about NSFilePosixPermisions:

    The corresponding value is an NSNumber object. Use the shortValue method to retrieve the integer value for the permissions.

    The proper way to set POSIX permissions is:

    // chmod permissions 777
    
    // Swift
    attributes[NSFilePosixPermissions] = 0o777
    
    // Objective-C
    [attributes setValue:[NSNumber numberWithShort:0777] 
                 forKey:NSFilePosixPermissions];