สร้างโฟลเดอร์ภายในโฟลเดอร์เอกสารในแอพ iOS


151

ฉันแค่ต้องการสร้างโฟลเดอร์ใหม่ในโฟลเดอร์เอกสารของแอพ iPhone ของฉัน

ไม่มีใครรู้วิธีการทำเช่นนั้น?

ขอบคุณที่คุณช่วย!

คำตอบ:


326

ฉันทำอย่างนั้นวิธีต่อไปนี้:

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
ขอบคุณสำหรับการตอบกลับใช้งานได้ แต่สร้างโฟลเดอร์ "MyFolder" ข้างโฟลเดอร์เอกสารของแอพ .. ไม่ได้อยู่ข้างใน ไม่รู้ทำไมจริงๆ
Mina Mikhael

3
ขออภัย - พิมพ์ผิดที่นั่น - ต้องผนวก @ "/ MyFolder" ไม่ใช่ @ "MyFolder" ต่อท้ายเอกสาร
Vladimir

2
คุณอาจต้องการเปลี่ยนบรรทัดที่สามเป็น NSString * dataPath = [DocumentsDirectory stringByAppendingString: @ "/ MyFolder"]; เนื่องจาก NSSearchPathForDirectoriesInDomains จะไม่ส่งกลับเครื่องหมายสแลช
Andreas

13
ฉันแก้ไขรหัสเพื่อใช้ "stringByAppendingPathComponent" ที่ถูกต้องมากขึ้นซึ่งทำสิ่งที่ถูกต้องไม่ว่าสตริงอินพุตจะมี "/" หรือไม่ก็ตาม
Kendall Helmstetter Gelner

ช่วยฉันมาก .. ขอบคุณ Vladimir
Cathy

14

ฉันไม่มีชื่อเสียงพอที่จะแสดงความคิดเห็นต่อคำตอบของ Manni แต่ [path objectAtIndex: 0] เป็นวิธีมาตรฐานในการรับ Directory Documents ของแอปพลิเคชัน

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

เนื่องจาก NSSearchPathForDirectoriesInDomains ฟังก์ชั่นได้รับการออกแบบมาสำหรับ Mac OS X ซึ่งอาจมีมากกว่าหนึ่งในแต่ละไดเรกทอรีเหล่านี้จึงส่งกลับอาร์เรย์ของเส้นทางมากกว่าเส้นทางเดียว ใน iOS อาร์เรย์ที่เป็นผลลัพธ์ควรมีเส้นทางเดียวไปยังไดเรกทอรี รายการ 3-1 แสดงการใช้ฟังก์ชันนี้โดยทั่วไป

รายการ 3-1 การหาเส้นทางไปยังไดเรกทอรีเอกสารของแอปพลิเคชัน

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

1
ฉันคิดว่าวิธีที่ง่ายที่สุดในการเรียกค้นเส้นทางของเอกสารคือ:NSString* path = [@"~/Documents" stringByExpandingTildeInPath];
S1LENT WARRIOR

14

โซลูชัน 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

ฉันไม่ชอบ "[เส้นทาง objectAtIndex: 0]" เพราะหาก Apple เพิ่มโฟลเดอร์ใหม่ที่ขึ้นต้นด้วย "A", "B" หรือ "C", "Documents" - โฟลเดอร์ไม่ใช่โฟลเดอร์แรกในไดเรกทอรี

ที่ดีกว่า:

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

8
ดูคำตอบของทิม การใช้ NSSearchPathForDirectoryiesInDomains เป็นวิธีมาตรฐานในการเรียกค้นไดเรกทอรีเอกสารผู้ใช้
Tim Swast

1
หาก Apple ตัดสินใจเปลี่ยนชื่อไดเรกทอรีเอกสารเป็น "MyDocuments" (หรือคล้ายกัน) วิธีการของคุณจะไม่ทำงาน
Mehlyfication

8

สวิฟท์ 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

มันใช้งานได้ดีสำหรับฉัน

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

มันควรจะเป็น NSDocumentDirectory แทน 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)
}

วิธีเขียนข้อมูลลงในไดเรกทอรีที่สร้างขึ้นใหม่ได้อย่างไร
Logger

1

รหัสต่อไปนี้อาจช่วยในการสร้างไดเรกทอรี:

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

}

การใช้งาน:

[self createDirectory:@"MyFolder"];

ผลลัพธ์ :

สร้างไดเรกทอรีแล้ว!

dataPath: / var / mobile / Applications / BD4B5566-1F11-4723-B54C-F1D0B23CBC / เอกสาร / MyFolder


1

Swift 1.2 และ iOS 8

สร้างไดเรกทอรีที่กำหนดเอง (ชื่อ = "MyCustomData") ภายในไดเรกทอรีเอกสาร แต่ถ้าไม่มีไดเรกทอรี

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

}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.