web-dev-qa-db-fra.com

Existe-t-il un moyen plus sûr de créer un répertoire s’il n’existe pas?

J'ai trouvé cette façon de créer un répertoire s'il n'existe pas. Mais cela semble un peu vicieux et je crains que cela ne se passe mal en 1 tentative sur 1 000.

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

Il y a seulement cette méthode peu pratique fileExistsAtPath qui cherche aussi des fichiers et pas seulement des répertoires. Mais pour moi, la chose dangereuse est: Et si cela ne va pas? Que dois-je faire? Quelle est la meilleure pratique pour garantir que le répertoire est créé et créé uniquement lorsqu'il n'existe pas?

Je sais que les opérations du système de fichiers ne sont jamais sécurisées. L’appareil peut perdre soudainement l’énergie de la batterie juste au moment où il commence à pelleter les éléments de A à B. Il peut également trébucher sur un support et s’accrocher une seconde. Peut-être que dans certains cas, il retourne OUI même s'il n'y a pas de répertoire. En termes simples: je ne fais pas confiance aux opérations du système de fichiers.

Comment puis-je rendre cela absolument sans danger?

34

Pour Swift 3.0

do {
    try FileManager.default.createDirectory(atPath: folder, withIntermediateDirectories: true, attributes: nil)
} catch {
    print(error)
}
5
Sergey Nikitin
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);

D'un sujet SO ici .

Après avoir créé un répertoire, vous pouvez vider le système de fichiers, puis vérifier si votre répertoire nouvellement créé existe. C'est probablement exagéré, mais vous ne pouvez jamais en avoir trop.

3
Charles Burns

Dans Swift 2, cela ressemble à ceci:

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

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)")
}
0
Abhishek Jain