【问题标题】:iOS9 FileManager File permissions changeiOS9 FileManager 文件权限变更
【发布时间】:2015-12-16 05:38:46
【问题描述】:

将我的应用程序切换到 iOS9 后,我开始收到我正在编写的文件不可读的错误。这是我创建文件的方式

let fileManager = NSFileManager.defaultManager()

let directory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]
let path = "\(directory)/file.txt"

let attributes: [String:AnyObject] = [NSFilePosixPermissions: NSNumber(short: 666)]
let success = fileManager.createFileAtPath(path, contents: nil, attributes: attributes)
if success && fileManager.isWritableFileAtPath(path) && fileManager.isReadableFileAtPath(path) {
    NSLog("Worked!")
} else {
    NSLog("Failed!")
}

当我这样做时,我总是看到失败!

【问题讨论】:

    标签: swift permissions swift2 nsfilemanager ios9


    【解决方案1】:

    原来的代码是错误的。您需要使用八进制表示的权限:

    https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/LexicalStructure.html#//apple_ref/swift/grammar/octal-literal

    正确代码:

    let fileManager = NSFileManager.defaultManager()
    
    let directory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]
    let path = "\(directory)/file.txt"
    
    let attributes: [String:AnyObject] = [NSFilePosixPermissions: NSNumber(short: 0o666)]
    let success = fileManager.createFileAtPath(path, contents: nil, attributes: attributes)
    if success && fileManager.isWritableFileAtPath(path) && fileManager.isReadableFileAtPath(path) {
        NSLog("Worked!")
    } else {
        NSLog("Failed!")
    }
    

    我用来测试所有可能权限的函数。

    func testPermissions() {
        let types: [Int16] = [0o666, 0o664, 0o662, 0o660, 0o646, 0o626, 0o606, 0o466, 0o266, 0o066]
        for t in types {
            testCreateFile(t)
        }
    }
    
    func testCreateFile(permissions: Int16)  {
        let attributes: [String:AnyObject] = [NSFilePosixPermissions: NSNumber(short: permissions)]
    
        let directory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]
        let filename = "filename\(permissions.description)"
        let path = "\(directory)/\(filename)"
    
        let fileManager = NSFileManager.defaultManager()
        let success = fileManager.createFileAtPath(path, contents: nil, attributes: attributes)
    
        if success && fileManager.isWritableFileAtPath(path) && fileManager.isReadableFileAtPath(path) {
            let octal = String(format:"%o", permissions)
            NSLog("It worked for \(octal)")
        }
    }
    

    【讨论】:

    • 这不是完全错误的吗?我怀疑权限应该是0666 而不是666。八进制与十进制有很大不同。
    • 我尝试将它表示为字符串形式的八进制。没用。在文档中它说 NSFilePosixPermissions 对应的值是一个 NSNumber 对象。这里:developer.apple.com/library/mac/documentation/Cocoa/Reference/…
    • 当然,它需要是一个 NSNumber,但“666”表示是八进制。您需要在 Swift 中使用 0o666。见developer.apple.com/library/ios/documentation/Swift/Conceptual/…
    • 否则,“666”表示0o1232,“466”表示0o722。
    • 该死的,干得好。我应该找到八进制表示。这一切都更有意义,看起来我们的原始代码只是计划破坏。我将更新我的答案。
    猜你喜欢
    • 1970-01-01
    • 2012-04-03
    • 2012-04-09
    • 2015-11-08
    • 2012-02-16
    • 2013-06-27
    • 2018-06-18
    • 2010-09-18
    • 1970-01-01
    相关资源
    最近更新 更多