如何使用Swift代码创建目录(NSFileManager)

Gia*_*ian 43 objective-c nsfilemanager ios nsdocumentdirectory swift

我在转换Objective-C代码为Swift创建目录时遇到了一些麻烦.

Objective-C的:

    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];
Run Code Online (Sandbox Code Playgroud)

Kam*_*pai 98

Swift 4.0编辑

let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
let documentsDirectory = paths[0]
let docURL = URL(string: documentsDirectory)!
let dataPath = docURL.appendingPathComponent("MyFolder")
if !FileManager.default.fileExists(atPath: dataPath.absoluteString) {
    do {
        try FileManager.default.createDirectory(atPath: dataPath.absoluteString, withIntermediateDirectories: true, attributes: nil)
    } catch {
        print(error.localizedDescription);
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑Swift 3.0

let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
let documentsDirectory: AnyObject = paths[0] as AnyObject
let dataPath = documentsDirectory.appendingPathComponent("MyFolder")!

do {
    try FileManager.default.createDirectory(atPath: dataPath.absoluteString, withIntermediateDirectories: false, attributes: nil)
} catch let error as NSError {
    print(error.localizedDescription);
}
Run Code Online (Sandbox Code Playgroud)

编辑swift 2.1

您可以使用以下方法创建目录:

let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
let documentsDirectory: AnyObject = paths[0]
let dataPath = documentsDirectory.appendingPathComponent("MyFolder")!

do {
    try FileManager.default.createDirectory(atPath: dataPath.absoluteString, withIntermediateDirectories: false, attributes: nil)
} catch let error as NSError {
    print(error.localizedDescription);
}
Run Code Online (Sandbox Code Playgroud)

  • 从Swift 2开始:do {try fileManager.createDirectoryAtPath(outputPath,withIntermediateDirectories:false,attributes:nil)} catch let error as NSError {print(error.localizedDescription); } (5认同)

Meh*_*deh 60

@Kampai和@ Crashalot的答案都不适合我.

.absoluteString使得一个URL 文件://前缀,导致异常在创建目录.相反,我使用了.path方法.

Swift 3的固定代码

let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let dataPath = documentsDirectory.appendingPathComponent("MyFolder")

do {
    try FileManager.default.createDirectory(atPath: dataPath.path, withIntermediateDirectories: true, attributes: nil)
} catch let error as NSError {
    print("Error creating directory: \(error.localizedDescription)")
}
Run Code Online (Sandbox Code Playgroud)

  • 感谢你,我一直试图想出这一天! (4认同)
  • 谢谢,.path对我来说是缺失的部分 (2认同)

Cra*_*lot 5

接受的答案不再编译,因为带有的行会appendingPathComponent产生错误。

这是一个编译的Swift 3版本:

fileprivate func createDir(dirName: String) {
    let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
    let dataPath = documentsDirectory.appendingPathComponent(dirName)

    do {
        try FileManager.default.createDirectory(atPath: dataPath.absoluteString, withIntermediateDirectories: false, attributes: nil)
    } catch let error as NSError {
        printError("Error creating directory: \(error.localizedDescription)")
    }
}
Run Code Online (Sandbox Code Playgroud)