web-dev-qa-db-ja.com

iOS9 Swift NSURLでNSFileManager.createDirectoryAtPathを作成するファイル

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「フォルダ「Documents」にファイル「logs」を保存する権限がありません。」 UserInfo = {NSFilePath = file:/// var/mobile/Containers/Data/Application/F2EF2D4F-94AF-4BF2-AF9E-D0ECBC8637E7/Documents/logs /、NSUnderlyingError = 0x15664d070 {エラードメイン= NSPOSIXErrorDomain Code = 1 "操作は許可されていません「}}

29
Moemars

これを見つけました。 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)")
}

誤ったパス(通知file://):

file:/// var/mobile/Containers/Data/Application/F2EF2D4F-94AF-4BF2-AF9E-D0ECBC8637E7/Documents/logs /

正しいパス:

/ var/mobile/Containers/Data/Application/F2EF2D4F-94AF-4BF2-AF9E-D0ECBC8637E7/Documents/logs /

84
Moemars

Swift

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