在iOS应用中的文档文件夹内创建一个文件夹

152

我只想在我的iPhone应用程序的文档文件夹中创建新文件夹。

有人知道如何做到这一点吗?

感谢您的帮助!

9个回答

330

我是这样做的:

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

2
你可能想把第三行改成 NSString *dataPath = [documentsDirectory stringByAppendingString:@"/MyFolder"]; 因为NSSearchPathForDirectoriesInDomains不会返回尾部斜杠。 - Andreas
14
我修改了代码,使用更正确的 "stringByAppendingPathComponent" 函数,无论输入字符串中是否包含 "/",它都会执行正确的操作。 - Kendall Helmstetter Gelner
我正在使用这种方式在文档文件夹中创建一个文件夹。但是在iOS 5.0.1的iPhone 3GS上运行良好,但在iOS 4.3.3的iPhone 4上无法创建文件夹,应用程序随后崩溃。有什么建议吗? - Panos
@Vladimir,我看不到,因为我已经安装了没有苹果许可的应用程序。它试图创建/User/Documents/MyAppName。在我的3gs上,5.0.1可以正常工作。但在iPhone 4上,4.3.3失败了。 - Panos
@Vladimir 是的,该路径位于应用沙盒之外。这是手机Unix文件系统中的完整路径“/User/Documents/MyAppName”。也许当我获得开发者许可并按照规定安装应用程序时,我就不会遇到这个问题了 :) - Panos
显示剩余2条评论

15

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

14

我没有足够的声望来评论Manni的回答,但[paths objectAtIndex:0]是获取应用程序文档目录的标准方法。

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展示了该函数的典型用法,获取应用程序文档目录的路径。
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

1
我认为检索文档目录路径的最简单方法是:NSString* path = [@"~/Documents" stringByExpandingTildeInPath]; - S1LENT WARRIOR

9
我不喜欢使用"[paths objectAtIndex:0]",因为如果苹果公司添加了一个以"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
使用NSSearchPathForDirectoriesInDomains是检索用户文档目录的标准方法,请参阅Tim的答案。 - Tim Swast
1
如果苹果决定将“Documents”目录重命名为“MyDocuments”(或类似名称),那么你的方法也将无法正常工作。 - Mehlyfication

8

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

对我来说这很好用,

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

4

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

结果:

目录已创建!

数据路径:/var/mobile/Applications/BD4B5566-1F11-4723-B54C-F1D0B23CBC/Documents/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...")
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接