NSFileManager и NSFilePosixPermissions

Я хочу использовать восьмеричные разрешения (используемые для 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.

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


person qwertz    schedule 11.03.2012    source источник


Ответы (2)


Во-первых, 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];
person gcbrueckmann    schedule 11.03.2012
comment
Спасибо! Только установить значение NSFilePermissions не работает Я сделал так: NSMutableDictionary *attributes = [NSMutableDictionary dictionaryWithDictionary:[manager attributesOfItemAtPath:@"file..." error:nil]];Следующий шаг Я установил разрешения и все заработало! - person qwertz; 11.03.2012
comment
Вы также можете использовать литеральную нотацию для передачи NSNumber (и NSDictionary): @{NSFilePosixPermissions: @0777} - person Matthemattics; 25.01.2014
comment
Обратите внимание, что ведущий ноль здесь является критическим. Это говорит компилятору C, что ваша константа находится в восьмеричном формате. Octal 0777 — это 511 в десятичном виде, а не одно и то же число! - person Duncan C; 08.12.2015
comment
Вы говорите коротко. Что, если я хочу использовать восьмеричное число 0100640 вместо 0640? Это совершенно верное восьмеричное число для C-версии chmod(). Однако короткое C может хранить только число до 32767, если оно подписано, и 65535, если оно не подписано. Этого недостаточно для хранения 0100640. - person Volomike; 14.03.2016
comment
Нет, это не я говорю. Apple.. Кроме того, этот атрибут касается прав доступа к файлам. Однако 0100000 не является битом разрешения. Это часть режима. Разрешения являются только подмножеством режима. - person gcbrueckmann; 15.03.2016
comment
Для тех, кто пересматривает это с помощью Swift, ведущего 0 недостаточно, чтобы указать, что число является восьмеричным, вы должны начинать с 0o. NSFileManager.defaultManager.setAttributes([NSFilePosixPermissions: NSNumber(short: 0o777)], ofItemAtPath: "/tmp/foo") - person drootang; 10.09.2016
comment
Добавлен пример Swift. Обратите внимание, что вам не нужно явно заключать значение в NSNumber. Мост Swift-Objective-C сделает это автоматически. - person gcbrueckmann; 12.09.2016
comment
В настоящее время обновлено до posixPermissions в swift 3 developer.apple.com/reference/foundation /fileattributekey/ - person Charlton Provatas; 19.11.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)
}
person Charlton Provatas    schedule 19.11.2016
comment
Большое тебе спасибо. Это сработало для меня. - person Douglas Frari; 12.04.2021