50

ディレクトリが存在しない場合、この方法でディレクトリを作成する方法を見つけました。しかし、それは少し不安定に見え、1000回の試行のうちの1回でこれがうまくいかない可能性があるのではないかと心配しています。

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

ディレクトリだけでなくファイルも検索するこの厄介なメソッドfileExistsAtPathだけがあります。しかし、私にとって危険なのは、これがうまくいかない場合はどうなるかということです。何をすればよいでしょうか?ディレクトリが作成され、ディレクトリが存在しない場合にのみ作成されることを保証するためのベストプラクティスは何ですか?

私はファイルシステムの操作が決して安全ではないことを知っています。デバイスは、ビットをAからBにシャベルで削り始めた瞬間に突然バッテリー電源を失う可能性があります。または、不良ビットに遭遇して1秒間ハングする可能性があります。たぶん、ディレクトリがなくてもYESを返すことはめったにありません。簡単に言えば、私はファイルシステムの操作を信用していません。

どうすればこれを絶対に安全にすることができますか?

4

6 に答える 6

91

ifAppleのドキュメントにはディレクトリが存在してはならないと書かれていても、実際にはスキップできます。これは、パスしている場合にのみ当てはまります。withIntermediateDirectories:NO

それはそれを1つの呼び出しに置きます。次のステップは、エラーをキャプチャすることです。

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

Swift3.0の場合

do {
    try FileManager.default.createDirectory(atPath: folder, withIntermediateDirectories: true, attributes: nil)
} catch {
    print(error)
}
于 2016-11-26T10:28:38.490 に答える
9

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)")
}
于 2018-11-20T11:11:55.960 に答える
6

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

スイフト2では次のようになります。

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