web-dev-qa-db-ja.com

存在しないディレクトリを作成するより安全な方法はありますか?

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

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

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

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

これを完全に安全にするにはどうすればよいですか?

40

Appleのドキュメントでは、ディレクトリ存在してはならないが存在すると記載されている場合でも、実際にifをスキップできます。これは、withIntermediateDirectories:NOを渡した場合にのみ当てはまります。

それは1つのコールにそれを置く。次のステップでは、エラーをキャプチャします。

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

notは、ディレクトリがすでに存在する場合はエラーになります。

82
e.James

Swift 3.0の場合

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

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)")
}
4
Abhishek Jain
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トピック ここ から。

ディレクトリを作成したら、ファイルシステムをフラッシュして、新しく作成したディレクトリが存在するかどうかを確認できます。これはおそらくやり過ぎですが、やりすぎはありません。

3
Charles Burns

Swift 2では、次のようになります。

do {
    try NSFileManager.defaultManager().createDirectoryAtPath(pathURL.absoluteString, withIntermediateDirectories: true, attributes: nil)
} catch {
    print(error)
}
1
Chris