Tạo một thư mục bên trong thư mục tài liệu trong ứng dụng iOS


151

Tôi chỉ muốn tạo các thư mục mới trong thư mục tài liệu của ứng dụng iPhone của mình.

Có ai biết làm thế nào để làm điều đó?

Đánh giá cao sự giúp đỡ của bạn!

Câu trả lời:


326

Tôi làm theo cách sau:

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
cảm ơn đã trả lời, nó hoạt động nhưng nó tạo thư mục "MyFolder" bên cạnh thư mục tài liệu của ứng dụng .. không bên trong nó. không biết tại sao thực sự
Mina Mikhael

3
Xin lỗi - là một lỗi đánh máy ở đó - phải nối @ "/ MyFolder", chứ không phải @ "MyFolder" vào đường dẫn tài liệu.
Vladimir

2
Bạn có thể muốn thay đổi dòng thứ ba thành NSString * dataPath = [DocumentsDirectory stringByAppendingString: @ "/ MyFolder"]; vì NSSearchPathForDirectoriesInDomains không trả về dấu gạch chéo.
Andreas

13
Tôi đã sửa mã để sử dụng "stringByAppendingPathComponent" chính xác hơn, điều này đúng, bất kể chuỗi đầu vào có "/" hay không.
Kendall Helmstetter Gelner

Đã giúp tôi rất nhiều .. Cảm ơn Vladimir
Cathy

14

Tôi không đủ uy tín để nhận xét về câu trả lời của Manni, nhưng [đường dẫn objectAt Index: 0] là cách tiêu chuẩn để nhận Thư mục Tài liệu của ứng dụng

http://developer.apple.com/l Library / ios / document / iPhone /Conualual /

Vì hàm NSSearchPathForDirectoriesInDomains được thiết kế ban đầu cho Mac OS X, nơi có thể có nhiều hơn một trong các thư mục này, nên nó trả về một mảng các đường dẫn thay vì một đường dẫn. Trong iOS, mảng kết quả sẽ chứa đường dẫn duy nhất đến thư mục. Liệt kê 3-1 cho thấy một cách sử dụng điển hình của hàm này.

Liệt kê 3-1 Lấy đường dẫn đến thư mục Documents của ứng dụng

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

1
Tôi nghĩ rằng cách đơn giản nhất để truy xuất đường dẫn thư mục tài liệu là:NSString* path = [@"~/Documents" stringByExpandingTildeInPath];
S1LENT WARRIOR 21/07/14

14

Giải pháp 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

Tôi không thích "[path objectAtIndex: 0]" bởi vì nếu Apple thêm một thư mục mới bắt đầu bằng "A", "B" oder "C", thì "Documents" -folder không phải là thư mục đầu tiên trong thư mục.

Tốt hơn:

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

8
Xem câu trả lời của Tim. Sử dụng NSSearchPathForDirectoryiesInDomains là cách tiêu chuẩn để truy xuất thư mục Tài liệu của người dùng.
Tim Swast

1
Nếu Apple quyết định đổi tên thư mục Documents thành "MyDocument" (hoặc tương tự), cách tiếp cận của bạn sẽ không hiệu quả.
Mehlyfication

8

Các Swift 2 giải pháp:

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

Cái này làm việc tốt cho tôi,

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

Nó phải là NSDocumentDirectory thay vì NSDocumentDirectory
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)
}

Làm thế nào để ghi dữ liệu vào thư mục mới tạo?
Logger

1

Mã sau có thể giúp tạo thư mục:

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

}

Sử dụng :

[self createDirectory:@"MyFolder"];

Kết quả :

thư mục được tạo!

dataPath: / var / mobile / Ứng dụng / BD4B5566-1F11-4723-B54C-F1D0B23CBC / Documents / MyFolder


1

Swift 1.2 và iOS 8

Tạo thư mục tùy chỉnh (name = "MyCustomData") trong thư mục tài liệu nhưng chỉ khi thư mục không tồn tại.

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

}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.