Créer un dossier dans le dossier de documents dans les applications iOS


Réponses:


326

Je fais cela de la manière suivante:

NSError *error;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; // Get documents folder
NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:@"/MyFolder"];

if (![[NSFileManager defaultManager] fileExistsAtPath:dataPath])
    [[NSFileManager defaultManager] createDirectoryAtPath:dataPath withIntermediateDirectories:NO attributes:nil error:&error]; //Create folder

1
merci pour la réponse, cela fonctionne mais il crée le dossier "MyFolder" à côté du dossier documents de l'application .. pas à l'intérieur. ne sais pas pourquoi en fait
Mina Mikhael

3
Désolé - il y avait une faute de frappe - doit ajouter @ "/ MyFolder", et non @ "MyFolder" au chemin des documents.
Vladimir

2
Vous souhaiterez peut-être changer la troisième ligne en NSString * dataPath = [documentsDirectory stringByAppendingString: @ "/ MyFolder"]; puisque NSSearchPathForDirectoriesInDomains ne renvoie pas de barres obliques de fin.
Andreas

13
J'ai corrigé le code pour utiliser le "stringByAppendingPathComponent" plus correct, qui fait la bonne chose indépendamment de la chaîne d'entrée ayant un "/" ou non.
Kendall Helmstetter Gelner

M'a beaucoup aidé .. Merci Vladimir
Cathy

14

Je n'ai pas assez de réputation pour commenter la réponse de Manni, mais [chemins objectAtIndex: 0] est le moyen standard d'obtenir le répertoire de documents de l'application

http://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/StandardBehaviors/StandardBehaviors.html#//apple_ref/doc/uid/TP40007072-CH4-SW6

Étant donné que la fonction NSSearchPathForDirectoriesInDomains a été conçue à l'origine pour Mac OS X, où il peut y avoir plus d'un de chacun de ces répertoires, elle renvoie un tableau de chemins plutôt qu'un seul chemin. Sous iOS, le tableau résultant doit contenir le chemin d'accès unique au répertoire. Le listing 3-1 montre une utilisation typique de cette fonction.

Listing 3-1 Obtenir le chemin d'accès au répertoire Documents de l'application

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

1
Je pense que le moyen le plus simple de récupérer le chemin du répertoire des documents est:NSString* path = [@"~/Documents" stringByExpandingTildeInPath];
S1LENT WARRIOR

14

Solution Swift 3:

private func createImagesFolder() {
        // path to documents directory
        let documentDirectoryPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first
        if let documentDirectoryPath = documentDirectoryPath {
            // create the custom folder path
            let imagesDirectoryPath = documentDirectoryPath.appending("/images")
            let fileManager = FileManager.default
            if !fileManager.fileExists(atPath: imagesDirectoryPath) {
                do {
                    try fileManager.createDirectory(atPath: imagesDirectoryPath,
                                                    withIntermediateDirectories: false,
                                                    attributes: nil)
                } catch {
                    print("Error creating images folder in documents dir: \(error)")
                }
            }
        }
    }

9

Je n'aime pas "[chemins objectAtIndex: 0]" car si Apple ajoute un nouveau dossier commençant par "A", "B" ou "C", le dossier "Documents" n'est pas le premier dossier du répertoire.

Mieux:

NSString *dataPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/MyFolder"];
if (![[NSFileManager defaultManager] fileExistsAtPath:dataPath])
    [[NSFileManager defaultManager] createDirectoryAtPath:dataPath withIntermediateDirectories:NO attributes:nil error:&error]; //Create folder

8
Voir la réponse de Tim. L'utilisation de NSSearchPathForDirectoryiesInDomains est le moyen standard de récupérer le répertoire Documents d'un utilisateur.
Tim Swast

1
Si Apple décide de renommer le répertoire Documents en "MyDocuments" (ou similaire), votre approche ne fonctionnera pas non plus.
Mehlyfication

8

La solution Swift 2 :

let documentDirectoryPath: String = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first!
if !NSFileManager.defaultManager().fileExistsAtPath(documentDirectoryPath) {
        do {
            try NSFileManager.defaultManager().createDirectoryAtPath(documentDirectoryPath, withIntermediateDirectories: false, attributes: nil)

        } catch let createDirectoryError as NSError {
            print("Error with creating directory at path: \(createDirectoryError.localizedDescription)")
        }

    }

5

Cela fonctionne bien pour moi,

NSFileManager *fm = [NSFileManager defaultManager];
NSArray *appSupportDir = [fm URLsForDirectory:NSDocumentsDirectory inDomains:NSUserDomainMask];
NSURL* dirPath = [[appSupportDir objectAtIndex:0] URLByAppendingPathComponent:@"YourFolderName"];

NSError*    theError = nil; //error setting
if (![fm createDirectoryAtURL:dirPath withIntermediateDirectories:YES
                           attributes:nil error:&theError])
{
   NSLog(@"not created");
}

Cela devrait être NSDocumentDirectory au lieu de NSDocumentsDirectory
Pradeep Reddy Kypa

3

Swift 4.0

let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
// Get documents folder
let documentsDirectory: String = paths.first ?? ""
// Get your folder path
let dataPath = documentsDirectory + "/yourFolderName"
if !FileManager.default.fileExists(atPath: dataPath) {
    // Creates that folder if not exists
    try? FileManager.default.createDirectory(atPath: dataPath, withIntermediateDirectories: false, attributes: nil)
}

comment écrire des données dans le répertoire nouvellement créé?
Logger

1

Le code suivant peut aider à créer un répertoire:

-(void) createDirectory : (NSString *) dirName {

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0]; // Fetch path for document directory
dataPath = (NSMutableString *)[documentsDirectory stringByAppendingPathComponent:dirName];

NSError *error;

if (![[NSFileManager defaultManager] createDirectoryAtPath:dataPath withIntermediateDirectories:NO attributes:nil error:&error]) {
    NSLog(@"Couldn't create directory error: %@", error);
}
else {
    NSLog(@"directory created!");
}

NSLog(@"dataPath : %@ ",dataPath); // Path of folder created

}

Utilisation:

[self createDirectory:@"MyFolder"];

Résultat :

répertoire créé!

dataPath: / var / mobile / Applications / BD4B5566-1F11-4723-B54C-F1D0B23CBC / Documents / MyFolder


1

Swift 1.2 et iOS 8

Créez un répertoire personnalisé (nom = "MyCustomData") dans le répertoire des documents mais uniquement si le répertoire n'existe pas.

// path to documents directory
let documentDirectoryPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first as! String

// create the custom folder path
let myCustomDataDirectoryPath = documentDirectoryPath.stringByAppendingPathComponent("/MyCustomData")

// check if directory does not exist
if NSFileManager.defaultManager().fileExistsAtPath(myCustomDataDirectoryPath) == false {

    // create the directory
    var createDirectoryError: NSError? = nil
    NSFileManager.defaultManager().createDirectoryAtPath(myCustomDataDirectoryPath, withIntermediateDirectories: false, attributes: nil, error: &createDirectoryError)

    // handle the error, you may call an exception
    if createDirectoryError != nil {
        println("Handle directory creation error...")
    }

}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.