Подтвердить что ты не робот

IOS9 Swift File Создание NSFileManager.createDirectoryAtPath с помощью NSURL

До iOS9 мы создали такую ​​директорию

let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as! String
let logsPath = documentsPath.stringByAppendingPathComponent("logs")
let errorPointer = NSErrorPointer()
NSFileManager.defaultManager().createDirectoryAtPath(logsPath, withIntermediateDirectories: true, attributes: nil, error: errorPointer)

Но с iOS9 они удалили String.stringByAppendingPathComponent. Инструмент автоматического преобразования заменил наше использование String в NSURL. createDirectoryAtPath() принимает строку, поэтому мне нужно преобразовать NSURL в строку. Мы использовали absolutePath так: (обновление для iOS9)

let documentsPath = NSURL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0])
let logsPath = documentsPath.URLByAppendingPathComponent("logs")
do {
    try NSFileManager.defaultManager().createDirectoryAtPath(logsPath.absoluteString, withIntermediateDirectories: true, attributes: nil)
} catch let error as NSError {
    NSLog("Unable to create directory \(error.debugDescription)")
}

Но я получаю следующую ошибку:

Невозможно создать каталог Error Domain = NSCocoaErrorDomain Code = 513 "У вас нет разрешения на сохранение файлов" журналов "в папке" Документы "." UserInfo = {NSFilePath = файл:///вар/мобильные/Контейнеры/Data/Application/F2EF2D4F-94AF-4BF2-AF9E-D0ECBC8637E7/Документы/журналы/, NSUnderlyingError = 0x15664d070 {Ошибка домена = NSPOSIXErrorDomain Code = 1 "Операция не разрешена" }}

4b9b3361

Ответ 1

Я понял это. createDirectoryAtPath() не может обработать путь с префиксом "file://". Чтобы получить путь без префикса, вы должны использовать path() или relativePath().

let documentsPath = NSURL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0])
let logsPath = documentsPath.URLByAppendingPathComponent("logs")
do {
    try NSFileManager.defaultManager().createDirectoryAtPath(logsPath.path!, withIntermediateDirectories: true, attributes: nil)
} catch let error as NSError {
    NSLog("Unable to create directory \(error.debugDescription)")
}

Неверный путь (файл уведомления://):

Файл:///вар/мобильный/Контейнеры/Data/Application/F2EF2D4F-94AF-4BF2-AF9E-D0ECBC8637E7/Документы/журналы/

Правильный путь:

/вар/мобильный/Контейнеры/данных/Применение/F2EF2D4F-94AF-4BF2-AF9E-D0ECBC8637E7/Документы/журналы/

Ответ 2

Swift 3

let documentsPath = NSURL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0])
let logsPath = documentsPath.appendingPathComponent("logs")
do {
    try FileManager.default.createDirectory(at: logsPath!, withIntermediateDirectories: true, attributes: nil)
} catch let error as NSError {
    NSLog("Unable to create directory \(error.debugDescription)")
}

Ответ 3

Swift 4

let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
let logsPath = paths[0].appendingPathComponent("logs")
do {
    try FileManager.default.createDirectory(at: logsPath, withIntermediateDirectories: true, attributes: nil)
} catch let error as NSError {
    NSLog("Unable to create directory \(error.debugDescription)")
}