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

时间:2011-05-25 14:13:10

标签: ios objective-c filesystems nsfilemanager nsdocumentdirectory

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

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

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

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

我怎样才能绝对安全?

6 个答案:

答案 0 :(得分:76)

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

如果目录已存在,将导致错误。

答案 1 :(得分:6)

对于Swift 3.0

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

答案 2 :(得分: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主题here

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

答案 3 :(得分:2)

Swift 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);
    }
}

答案 4 :(得分:1)

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

void distinguish_string(char s[])
{
  if (s[0] == 'y')
      strcpy(s, "yes");
  else if (s[0] == 'n')
      strcpy(s, "no");
  else 
      printf("Please enter a valid answer. Like 'yes' or 'no', 'y' or 'n'.\n> ");
}

答案 5 :(得分:0)

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