Crie uma pasta dentro da pasta de documentos nos aplicativos iOS

151

Eu só quero criar novas pastas na pasta de documentos do meu aplicativo para iPhone.

alguém sabe como fazer aquilo?

Agradeço sua ajuda!

Mina Mikhael
fonte

Respostas:

326

Eu faço isso da seguinte maneira:

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
fonte
1
obrigado pela resposta, ele funciona, mas cria a pasta "MyFolder" ao lado da pasta de documentos do aplicativo. não dentro dele. Não sei por que, na verdade
Mina Mikhael
3
Desculpe - houve um erro de digitação - deve anexar @ "/ MyFolder", não @ "MyFolder" a um caminho de documentos.
Vladimir
2
Você pode alterar a terceira linha para NSString * dataPath = [documentsDirectory stringByAppendingString: @ "/ MyFolder"]; como NSSearchPathForDirectoriesInDomains não retorna barras finais.
Andreas
13
Corrigi o código para usar o "stringByAppendingPathComponent" mais correto, que faz a coisa certa, independentemente da string de entrada ter um "/" ou não.
Kendall Helmstetter Gelner
Me ajudou muito .. Obrigado Vladimir
Cathy
14

Não tenho reputação suficiente para comentar a resposta de Manni, mas [caminhos objectAtIndex: 0] é a maneira padrão de obter o diretório de documentos do aplicativo

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

Como a função NSSearchPathForDirectoriesInDomains foi projetada originalmente para o Mac OS X, onde poderia haver mais de um de cada um desses diretórios, ela retorna uma matriz de caminhos em vez de um único caminho. No iOS, a matriz resultante deve conter o caminho único para o diretório. A Listagem 3-1 mostra um uso típico dessa função.

Listagem 3-1 Obtendo o caminho para o diretório Documents do aplicativo

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
Tim
fonte
1
Eu acho que a maneira mais simples de recuperar o caminho do diretório de documentos é:NSString* path = [@"~/Documents" stringByExpandingTildeInPath];
S1LENT WARRIOR
14

Solução 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
fonte
9

Não gosto de "[caminhos objectAtIndex: 0]" porque se a Apple adicionar uma nova pasta começando com "A", "B" ou "C", a pasta "Documentos" não será a primeira pasta do diretório.

Melhor:

NSString *dataPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/MyFolder"];
if (![[NSFileManager defaultManager] fileExistsAtPath:dataPath])
    [[NSFileManager defaultManager] createDirectoryAtPath:dataPath withIntermediateDirectories:NO attributes:nil error:&error]; //Create folder
Manni
fonte
8
Veja a resposta de Tim. O uso do NSSearchPathForDirectoryiesInDomains é a maneira padrão de recuperar um diretório de documentos do usuário.
Tim Swast 18/03/11
1
Se a Apple decidir renomear o diretório Documents para "MyDocuments" (ou similar), sua abordagem também não funcionará.
Mehlyfication
8

A solução 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
fonte
5

Este trabalho é bom para mim,

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
fonte
Deveria ser NSDocumentDirectory em vez de NSDocumentsDirectory
Pradeep Reddy Kypa 30/17
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
fonte
como gravar dados no diretório recém-criado?
Logger
1

O código a seguir pode ajudar na criação do diretório:

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

diretório criado!

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

Jayprakash Dubey
fonte
1

Swift 1.2 e iOS 8

Crie um diretório personalizado (nome = "MyCustomData") dentro do diretório de documentos, mas apenas se o diretório não existir.

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

}
user3378170
fonte