【问题标题】:NSFileManager & NSFilePosixPermissionsNSFileManager & NSFilePosixPermissions
【发布时间】:2012-03-28 03:37:31
【问题描述】:

我想为 NSFilePosixPermissions 使用八进制权限(用于 chmod)。 这是我现在所做的:

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。

怎么了? 感谢您的帮助。

【问题讨论】:

    标签: xcode permissions nsdictionary nsfilemanager chmod


    【解决方案1】:

    首先,NSFilePosixPermissions 是一个常量的名称。它的值也可能相同,但不能保证。 NSFilePosixPermissions 常量的值可能会在框架版本之间发生变化,例如。 G。从@"NSFilePosixPermissions"@"posixPermisions"。这会破坏你的代码。正确的做法是使用常量NSFilePosixPermissions,而不是@"NSFilePosixPermissions"

    另外,NSFilePosixPermissions reference 表示NSFilePosixPermisions

    对应的值是一个NSNumber 对象。使用shortValue 方法检索权限的整数值。

    设置POSIX权限的正确方法是:

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

    【讨论】:

    • 谢谢!只设置 NSFilePermissions 值不起作用 我这样做了:NSMutableDictionary *attributes = [NSMutableDictionary dictionaryWithDictionary:[manager attributesOfItemAtPath:@"file..." error:nil]];Next step 我设置了权限并且它起作用了!
    • 你也可以使用文字符号来传递一个 NSNumber(和 NSDictionary):@{NSFilePosixPermissions: @0777}
    • 请注意,这里的前导零很关键。这告诉 C 编译器你的常量是八进制的。八进制 0777 是十进制的 511,不是同一个数字!
    • 你说的很短。如果我想要的八进制数是 0100640 而不是 0640 怎么办?对于 C 的 chmod() 版本,这是一个完全有效的八进制数。但是,如果有符号,C short 最多只能存储 32767 的数字,如果没有符号,则最多只能存储 65535。这还不足以存储 0100640。
    • 不,这不是我说的。 Apple is.。此外,此属性与文件权限有关。但是,0100000 不是权限位。这是模式的一部分。权限只是模式的一个子集。
    【解决方案2】:

    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)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-13
      • 2011-09-18
      • 2011-06-22
      • 2015-05-29
      • 1970-01-01
      • 1970-01-01
      • 2014-09-01
      • 2014-01-14
      相关资源
      最近更新 更多