Crea una cartella all'interno della cartella documenti nelle app iOS


Risposte:


326

Lo faccio nel modo seguente:

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
grazie per la risposta, funziona ma crea la cartella "MyFolder" accanto alla cartella documenti dell'app ... non al suo interno. non so perché in realtà
Mina Mikhael,

3
Ci dispiace - c'era un refuso lì - deve aggiungere @ "/ MyFolder", non @ "MyFolder" a un percorso di documenti.
Vladimir

2
Potresti voler cambiare la terza riga in NSString * dataPath = [documentsDirectory stringByAppendingString: @ "/ MyFolder"]; poiché NSSearchPathForDirectoriesInDomains non restituisce barre finali.
Andreas,

13
Ho corretto il codice per utilizzare il "stringByAppendingPathComponent" più corretto, che fa la cosa giusta indipendentemente dal fatto che una stringa di input abbia un "/" o meno.
Kendall Helmstetter Gelner,

Mi ha aiutato molto ... Grazie Vladimir
Cathy,

14

Non ho abbastanza reputazione per commentare la risposta di Manni, ma [percorsi objectAtIndex: 0] è il modo standard per ottenere la directory dei documenti dell'applicazione

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

Poiché la funzione NSSearchPathForDirectoriesInDomains è stata progettata originariamente per Mac OS X, dove potrebbe esserci più di una di ciascuna di queste directory, restituisce una matrice di percorsi anziché un singolo percorso. In iOS, l'array risultante dovrebbe contenere il singolo percorso della directory. Il Listato 3-1 mostra un uso tipico di questa funzione.

Listato 3-1 Ottenere il percorso della directory Documents dell'applicazione

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

1
Penso che il modo più semplice per recuperare il percorso della directory dei documenti sia:NSString* path = [@"~/Documents" stringByExpandingTildeInPath];
S1LENT WARRIOR

14

Soluzione 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

Non mi piace "[percorsi objectAtIndex: 0]" perché se Apple aggiunge una nuova cartella che inizia con "A", "B" o "C", la cartella "Documents" non è la prima cartella nella directory.

Meglio:

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

8
Vedi la risposta di Tim. L'uso di NSSearchPathForDirectoryiesInDomains è il modo standard di recuperare una directory dei documenti degli utenti.
Tim Swast,

1
Se Apple decide di rinominare la directory Documents in "MyDocuments" (o simile), anche il tuo approccio non funzionerà.
Mehlyfication,

8

La soluzione 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

Questo funziona bene per me,

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

Dovrebbe essere NSDocumentDirectory invece di 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)
}

come scrivere i dati nella directory appena creata?
Registratore

1

Il codice seguente può aiutare nella creazione della directory:

-(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

}

Utilizzo:

[self createDirectory:@"MyFolder"];

Risultato:

directory creata!

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


1

Swift 1.2 e iOS 8

Crea una directory personalizzata (name = "MyCustomData") all'interno della directory dei documenti ma solo se la directory non esiste.

// 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...")
    }

}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.