50

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

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

只有这个笨拙的方法 fileExistsAtPath 还查找文件而不仅仅是目录。但对我来说,危险的事情是:如果出现问题怎么办?我该怎么办?什么是保证创建目录的最佳实践,并且只在它不存在时创建?

我知道文件系统操作从来都不是安全的。设备可能会在它开始将钻头从 A 铲到 B 的那一刻突然失去电池电量。或者它可能会偶然发现一个坏钻头并挂起一秒钟。也许在极少数情况下,即使没有目录,它也会返回 YES。简单地说:我不信任文件系统操作。

我怎样才能使它绝对安全?

4

6 回答 6

91

您实际上可以跳过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);
    //..
}

如果目录已经存在,这不会导致错误。

于 2011-05-25T14:32:42.227 回答
10

对于 Swift 3.0

do {
    try FileManager.default.createDirectory(atPath: folder, withIntermediateDirectories: true, attributes: nil)
} catch {
    print(error)
}
于 2016-11-26T10:28:38.490 回答
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)")
}
于 2018-11-20T11:11:55.960 回答
6

斯威夫特 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);
    }
}
于 2020-06-17T11:23:01.393 回答
3
NSFileManager *fileManager= [NSFileManager defaultManager]; 
if(![fileManager fileExistsAtPath:directory isDirectory:&isDir])
    if(![fileManager createDirectoryAtPath:directory withIntermediateDirectories:YES attributes:nil error:NULL])
        NSLog(@"Error: Create folder failed %@", directory);

从这里的一个 SO 主题。

创建目录后,您可以刷新文件系统,然后检查新创建的目录是否存在。这可能是矫枉过正,但你永远不能有太多矫枉过正。

于 2011-05-25T14:27:50.457 回答
1

在 swift 2 中,它看起来像这样:

do {
    try NSFileManager.defaultManager().createDirectoryAtPath(pathURL.absoluteString, withIntermediateDirectories: true, attributes: nil)
} catch {
    print(error)
}
于 2015-11-29T03:59:50.617 回答