2015-09-18 2 views
1

После переключения моего приложения на iOS9 я начал получать ошибки, что файлы, которые я писал, были недоступны для чтения. Вот как я создаю файлыiOS9 FileManager Изменение прав доступа к файлам

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

Когда я это делаю, я все время вижу, что не удалось !.

ответ

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

Функция I используется для проверки всех возможных разрешений.

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)") 
    } 
} 
+0

Разве это не совсем так? Я подозреваю, что разрешения должны быть '0666', а не' 666'. Октал сильно отличается от десятичного. – jtbandes

+0

Я попытался представить его как восьмеричную строку. Не работает. В документах говорится, что соответствующее значение NSFilePosixPermissions является объектом NSNumber. Здесь: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSFileManager_Class/#//apple_ref/doc/constant_group/File_Attribute_Keys – Moemars

+0

Конечно, это должен быть номер NSNumber, но Представление «666» - восьмеричное. Вам нужно использовать '0o666' в Swift. См. Https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/LexicalStructure.html#//apple_ref/swift/grammar/octal-literal – jtbandes

Смежные вопросы