如果目录不存在,是否有更安全的方法来创建目录?

don*_*ile 38 filesystems objective-c nsfilemanager ios nsdocumentdirectory

如果目录不存在,我发现了这种创建目录的方法.但它看起来有点不稳定,我担心这可能会在1000次尝试中出现错误.

if(![[NSFileManager defaultManager] fileExistsAtPath:bundlePath]) {
    [[NSFileManager defaultManager] createDirectoryAtPath:bundlePath withIntermediateDirectories:YES attributes:nil error:NULL];
}
Run Code Online (Sandbox Code Playgroud)

只有这个笨拙的方法fileExistsAtPath也可以查找文件,而不仅仅是目录.但对我来说,危险的是:如果这出错怎么办?我该怎么办?保证创建目录的最佳做法是什么,只有在目录不存在时才创建?

我知道文件系统操作永远不会安全.设备可能会在它开始从A到B的位置时突然耗尽电池电量.或者它会偶然发现一个坏位并挂了一秒钟.也许在一些很少的情况下,即使没有目录,它也会返回YES.简单地说:我不相信文件系统操作.

我怎样才能绝对安全?

e.J*_*mes 79

实际上你可以跳过if,即使Apple的文档说该目录不能存在,只有你通过时才会这样withIntermediateDirectories:NO

这归结为一个电话.下一步是捕获任何错误:

NSError * error = nil;
[[NSFileManager defaultManager] createDirectoryAtPath:bundlePath
                          withIntermediateDirectories:YES
                                           attributes:nil
                                                error:&error];
if (error != nil) {
    NSLog(@"error creating directory: %@", error);
    //..
}
Run Code Online (Sandbox Code Playgroud)

如果目录已存在,则不会导致错误.

  • 您需要检查返回值,而不是错误指针 (6认同)

Abh*_*ain 9

斯威夫特 4.2

let fileManager = FileManager.default
let documentsURL =  fileManager.urls(for: .documentDirectory, in: .userDomainMask).first!

let imagesPath = documentsURL.appendingPathComponent("Images")
do
{
    try FileManager.default.createDirectory(atPath: imagesPath.path, withIntermediateDirectories: true, attributes: nil)
}
catch let error as NSError
{
    NSLog("Unable to create directory \(error.debugDescription)")
}
Run Code Online (Sandbox Code Playgroud)


Ser*_*tin 7

对于Swift 3.0

do {
    try FileManager.default.createDirectory(atPath: folder, withIntermediateDirectories: true, attributes: nil)
} catch {
    print(error)
}
Run Code Online (Sandbox Code Playgroud)


小智 5

斯威夫特 5.0

let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
let documentsDirectory = paths[0]
let docURL = URL(string: documentsDirectory)!
let dataPath = docURL.appendingPathComponent("MyFolder")
if !FileManager.default.fileExists(atPath: dataPath.absoluteString) {
    do {
        try FileManager.default.createDirectory(atPath: dataPath.absoluteString, withIntermediateDirectories: true, attributes: nil)
    } catch {
        print(error.localizedDescription);
    }
}
Run Code Online (Sandbox Code Playgroud)