Crear una carpeta dentro de la carpeta de documentos en aplicaciones iOS

Respuestas:

326

Lo hago de la siguiente manera:

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
fuente
1
gracias por la respuesta, funciona pero crea la carpeta "MyFolder" al lado de la carpeta de documentos de la aplicación ... no dentro de ella. no sé por qué en realidad
Mina Mikhael
3
Lo sentimos, fue un error tipográfico allí, debe agregar @ "/ MyFolder", no @ "MyFolder" a una ruta de documentos.
Vladimir
2
Es posible que desee cambiar la tercera línea a NSString * dataPath = [documentsDirectory stringByAppendingString: @ "/ MyFolder"]; dado que NSSearchPathForDirectoriesInDomains no devuelve barras diagonales finales.
Andreas
13
Arreglé el código para usar el "stringByAppendingPathComponent" más correcto, que hace lo correcto independientemente de que la cadena de entrada tenga "/" o no.
Kendall Helmstetter Gelner el
Me ayudó mucho .. Gracias Vladimir
Cathy
14

No tengo suficiente reputación para comentar la respuesta de Manni, pero [caminos objectAtIndex: 0] es la forma estándar de obtener el Directorio de Documentos de la aplicación

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

Debido a que la función NSSearchPathForDirectoriesInDomains fue diseñada originalmente para Mac OS X, donde podría haber más de uno de cada uno de estos directorios, devuelve una matriz de rutas en lugar de una sola ruta. En iOS, la matriz resultante debe contener la ruta única al directorio. El listado 3-1 muestra un uso típico de esta función.

Listado 3-1 Obteniendo la ruta al directorio de Documentos de la aplicación

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
Tim
fuente
1
Creo que la forma más sencilla de recuperar la ruta del directorio de documentos es:NSString* path = [@"~/Documents" stringByExpandingTildeInPath];
S1LENT WARRIOR
14

Solución 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
fuente
9

No me gusta "[rutas objectAtIndex: 0]" porque si Apple agrega una nueva carpeta que comienza con "A", "B" o "C", la carpeta "Documentos" no es la primera carpeta del directorio.

Mejor:

NSString *dataPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/MyFolder"];
if (![[NSFileManager defaultManager] fileExistsAtPath:dataPath])
    [[NSFileManager defaultManager] createDirectoryAtPath:dataPath withIntermediateDirectories:NO attributes:nil error:&error]; //Create folder
Manni
fuente
8
Ver la respuesta de Tim. El uso de NSSearchPathForDirectoryiesInDomains es la forma estándar de recuperar un directorio de documentos de los usuarios.
Tim Swast
1
Si Apple decide cambiar el nombre del directorio Documentos a "Mis documentos" (o similar), su enfoque tampoco funcionará.
Mehlyfication
8

La solución 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
fuente
5

Esto funciona bien para mi,

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
fuente
Debería ser NSDocumentDirectory en lugar 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
fuente
¿Cómo escribir datos en el directorio recién creado?
Registrador
1

El siguiente código puede ayudar a crear el directorio:

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

}

Uso:

[self createDirectory:@"MyFolder"];

Resultado:

directorio creado!

dataPath: / var / mobile / Aplicaciones / BD4B5566-1F11-4723-B54C-F1D0B23CBC / Documentos / MyFolder

Jayprakash Dubey
fuente
1

Swift 1.2 y iOS 8

Cree un directorio personalizado (nombre = "MyCustomData") dentro del directorio de documentos, pero solo si el directorio no existe.

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

}
usuario3378170
fuente