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

151

Je souhaite simplement créer de nouveaux dossiers dans le dossier documents de mon application iPhone.

Est-ce que quelqu'un sait comment faire ça?

Apprécier ton aide!

Mina Mikhael
la source

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
Vladimir
la source
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];
Tim
la source
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)")
                }
            }
        }
    }
Miralem Cebic
la source
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
Manni
la source
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)")
        }

    }
rafalkitta
la source
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");
}
Tong Liu
la source
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)
}
Abhishek Jain
la source
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

Jayprakash Dubey
la source
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...")
    }

}
utilisateur3378170
la source