2015-09-18 23 views
24

Prima iOS9, ci aveva creato una directory in questo modoFile iOS9 Swift Creazione NSFileManager.createDirectoryAtPath con NSURL

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) 

Ma con iOS9 hanno tolto String.stringByAppendingPathComponent. Lo strumento di conversione automatica ha sostituito il nostro uso di String con NSURL. createDirectoryAtPath() prende una stringa, quindi ho bisogno di convertire NSURL in una stringa. Abbiamo usato AbsolutePath in questo modo: (aggiornamento per 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)") 
} 

Ma sto ottenendo il seguente errore:

Unable to create directory Error Domain=NSCocoaErrorDomain Code=513 "You don’t have permission to save the file “logs” in the folder “Documents”." UserInfo={NSFilePath=file:///var/mobile/Containers/Data/Application/F2EF2D4F-94AF-4BF2-AF9E-D0ECBC8637E7/Documents/logs/, NSUnderlyingError=0x15664d070 {Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted"}}

risposta

69

ho capito questo fuori. createDirectoryAtPath() non è in grado di elaborare un percorso con il prefisso "file: //". Per ottenere un percorso senza il prefisso devi usare path() o 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)") 
} 

percorso non corretto (file avviso: //):

file: /// var/mobile/Contenitori/dati/applicazioni/F2EF2D4F-94AF-4BF2-AF9E-D0ECBC8637E7/Documenti/logs/

percorso corretto:

/var/mobile/Contenitori/dati/applicazioni// F2EF2D4F-94AF-4BF2-AF9E-D0ECBC8637E7 Documenti/logs/

+2

funziona in iOS 9.2 – Roger

+0

** relativoPath ** è il vincitore. Avevo .absoluteString ma sembra che sia obsoleto da tempo. –

10

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