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

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];

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

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

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

    }

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

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

¿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


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

}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.