NSFileManager & NSFilePosixPermissions - PullRequest
       21

NSFileManager & NSFilePosixPermissions

6 голосов
/ 11 марта 2012

Я хочу использовать восьмеричные разрешения (используемые для chmod) для NSFilePosixPermissions.Вот что я сделал сейчас:

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

Я не получаю ошибки, но когда я проверяю результат с помощью "ls -o", разрешение не -rwxrwxrwx.

Что не так?Спасибо за помощь.

Ответы [ 2 ]

14 голосов
/ 11 марта 2012

Во-первых, NSFilePosixPermissions - это имя константы.Его значение также может быть одинаковым, но это не гарантируется.Значение константы NSFilePosixPermissions может меняться между выпусками платформы, например, от @"NSFilePosixPermissions" до @"posixPermisions".Это сломало бы ваш код.Правильный путь - использовать константу в качестве NSFilePosixPermissions, а не @"NSFilePosixPermissions".

. Кроме того, ссылка NSFilePosixPermissions говорит о NSFilePosixPermisions:

Соответствующее значение - объект NSNumber.Используйте метод shortValue для получения целочисленного значения для разрешений.

Правильный способ установки разрешений POSIX:

// chmod permissions 777

// Swift
attributes[NSFilePosixPermissions] = 0o777

// Objective-C
[attributes setValue:[NSNumber numberWithShort:0777] 
             forKey:NSFilePosixPermissions];
3 голосов
/ 20 ноября 2016

Решение в Swift 3

let fm = FileManager.default

var attributes = [FileAttributeKey : Any]()
attributes[.posixPermissions] = 0o777
do {
    try fm.setAttributes(attributes, ofItemAtPath: path.path)
}catch let error {
    print("Permissions error: ", error)
}
...