web-dev-qa-db-fra.com

fichier Swift iOS9 Création de NSFileManager.createDirectoryAtPath avec NSURL

Avant iOS9, nous avions créé un répertoire comme celui-ci.

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)

Mais avec iOS9, ils ont supprimé String.stringByAppendingPathComponent. L'outil de conversion automatique a remplacé notre utilisation de String par NSURL. createDirectoryAtPath () prend une chaîne, je dois donc convertir le NSURL en chaîne. Nous avons utilisé absolutePath comme suit: (mise à jour pour 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)")
}

Mais j'obtiens l'erreur suivante:

Impossible de créer le répertoire Error Domain = NSCocoaErrorDomain Code = 513 "Vous n’êtes pas autorisé à enregistrer le fichier" journaux "dans le dossier " Documents "." UserInfo = {NSFilePath = file: ///var/mobile/Containers/Data/Application/F2EF2D4F-94AF-4BF2-AF9E-D0ECBC8637E7/Documents/logs/, NSUnderlyingError = 0x15664d070 {Domaine d'erreur = Code NSPOSIXErrorDomain = 1 "Opération non autorisée"}}

28
Moemars

J'ai compris celui-ci. createDirectoryAtPath () est incapable de traiter un chemin avec le préfixe "fichier: //". Pour obtenir un chemin sans le préfixe, vous devez utiliser path () ou 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)")
}

Chemin incorrect (fichier de notification: //):

fichier: /// var/mobile/conteneurs/données/application/F2EF2D4F-94AF-4BF2-AF9E-D0ECBC8637E7/Documents/logs /

Chemin correct:

/ var/mobile/Conteneurs/Données/Application/F2EF2D4F-94AF-4BF2-AF9E-D0ECBC8637E7/Documents/logs /

78
Moemars

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)")
}
12
loaer

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)")
}
0
R.Vlaskovski