Erstellen Sie einen Ordner im Dokumentenordner in iOS-Apps

Antworten:

326

Ich mache das folgendermaßen:

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
quelle
1
Vielen Dank für die Antwort, es funktioniert, aber es erstellt den Ordner "MyFolder" neben dem Dokumentenordner der App .. nicht darin. Ich weiß nicht warum eigentlich
Mina Mikhael
3
Entschuldigung - war dort ein Tippfehler - muss @ "/ MyFolder" anhängen, nicht @ "MyFolder" an einen Dokumentpfad.
Vladimir
2
Möglicherweise möchten Sie die dritte Zeile in NSString ändern. * DataPath = [documentsDirectory stringByAppendingString: @ "/ MyFolder"]; da NSSearchPathForDirectoriesInDomains keine abschließenden Schrägstriche zurückgibt.
Andreas
13
Ich habe den Code so korrigiert, dass die korrektere "stringByAppendingPathComponent" verwendet wird, die das Richtige tut, unabhängig davon, ob eine Eingabezeichenfolge ein "/" hat oder nicht.
Kendall Helmstetter Gelner
Hat mir sehr geholfen. Danke Vladimir
Cathy
14

Ich habe nicht genug Ruf, um Mannis Antwort zu kommentieren, aber [Pfade objectAtIndex: 0] ist die Standardmethode, um das Dokumentenverzeichnis der Anwendung abzurufen

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

Da die Funktion NSSearchPathForDirectoriesInDomains ursprünglich für Mac OS X entwickelt wurde, in dem möglicherweise mehr als eines dieser Verzeichnisse vorhanden ist, wird anstelle eines einzelnen Pfads ein Array von Pfaden zurückgegeben. In iOS sollte das resultierende Array den einzelnen Pfad zum Verzeichnis enthalten. Listing 3-1 zeigt eine typische Verwendung dieser Funktion.

Listing 3-1: Abrufen des Pfads zum Verzeichnis "Dokumente" der Anwendung

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
Tim
quelle
1
Ich denke, der einfachste Weg, um den Dokumentenverzeichnispfad abzurufen, ist:NSString* path = [@"~/Documents" stringByExpandingTildeInPath];
S1LENT WARRIOR
14

Swift 3 Lösung:

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
quelle
9

Ich mag "[path objectAtIndex: 0]" nicht, denn wenn Apple einen neuen Ordner hinzufügt, der mit "A", "B" oder "C" beginnt, ist der Ordner "Documents" nicht der erste Ordner im Verzeichnis.

Besser:

NSString *dataPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/MyFolder"];
if (![[NSFileManager defaultManager] fileExistsAtPath:dataPath])
    [[NSFileManager defaultManager] createDirectoryAtPath:dataPath withIntermediateDirectories:NO attributes:nil error:&error]; //Create folder
Manni
quelle
8
Siehe Tims Antwort. Die Verwendung von NSSearchPathForDirectoryiesInDomains ist die Standardmethode zum Abrufen eines Benutzerdokumentenverzeichnisses.
Tim Swast
1
Wenn Apple beschließt, das Dokumentenverzeichnis in "MyDocuments" (oder ähnliches) umzubenennen, funktioniert Ihr Ansatz ebenfalls nicht.
Mehlyfication
8

Die Swift 2- Lösung:

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
quelle
5

Das funktioniert gut für mich,

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
quelle
Es sollte NSDocumentDirectory anstelle von NSDocumentsDirectory sein
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
quelle
Wie schreibe ich Daten in ein neu erstelltes Verzeichnis?
Logger
1

Der folgende Code kann beim Erstellen des Verzeichnisses hilfreich sein:

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

}

Verwendung :

[self createDirectory:@"MyFolder"];

Ergebnis:

Verzeichnis erstellt!

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

Jayprakash Dubey
quelle
1

Swift 1.2 und iOS 8

Erstellen Sie ein benutzerdefiniertes Verzeichnis (name = "MyCustomData") im Dokumentenverzeichnis, jedoch nur, wenn das Verzeichnis nicht vorhanden ist.

// 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
quelle