【问题标题】:How to create directory using Swift code (NSFileManager)如何使用 Swift 代码(NSFileManager)创建目录
【发布时间】:2015-01-11 22:11:58
【问题描述】:

我在转换 Objective-C 代码以创建 Swift 目录时遇到了一些问题。

目标-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];

【问题讨论】:

  • 向我们展示您在 Swift 中的尝试,以及它无法正常工作的原因。
  • 我认为询问 OP 在 Swift 中尝试了什么有点粗鲁,因为这个问题对于任何熟悉 Swift 并愿意提供帮助的人来说都很清楚。

标签: ios objective-c swift nsfilemanager nsdocumentdirectory


【解决方案1】:

Swift 5.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.path) {
    do {
        try FileManager.default.createDirectory(atPath: dataPath.path, withIntermediateDirectories: true, attributes: nil)
    } catch {
        print(error.localizedDescription)
    }
}

Swift 4.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)
}

Swift 3.0

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

斯威夫特 2.1

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

let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
let documentsDirectory: AnyObject = paths[0]
let dataPath = documentsDirectory.stringByAppendingPathComponent("MyFolder")

do {
    try NSFileManager.defaultManager().createDirectoryAtPath(dataPath, withIntermediateDirectories: false, attributes: nil)
} catch let error as NSError {
    print(error.localizedDescription)
}

【讨论】:

  • 从 Swift 2 开始:do { try fileManager.createDirectoryAtPath(outputPath, withIntermediateDirectories: false, attributes: nil) } catch let error as NSError { print(error.localizedDescription); }
  • “我的文件夹”?你的意思是“我的文件”吗?
  • 我收到一个错误,在使用此代码创建文件后我无权访问该文件
  • @DanielSpringer:请阅读问题,答案是关于使用 Swift 创建目录。因此,此代码对您不起作用,因为您正在尝试使用 createDirectory() 函数创建文件。
  • @Kampai 是的,我看到这个答案就是问题的答案。我有一个类似/相关的问题。
【解决方案2】:

接受的答案不再编译,因为带有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)")
    }
}

【讨论】:

  • 我确实在 iPhone 上尝试过,但在设备中找不到创建的文件夹。已将设备更新到 iOS 11,其中包含文件 App。
【解决方案3】:

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

.absoluteString 使用 file:// 前缀创建 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)")
}

【讨论】:

  • 向你致敬,我已经尝试了一天!
  • 谢谢,.path 对我来说是缺失的部分
  • 创建文件夹时,是否需要检查文件夹是否存在?
  • 不,不需要,因为我们发送 withIntermediateDirectories: true。如果文件夹创建/存在,无论如何它都会返回 true。你可以在这里阅读更多:developer.apple.com/documentation/foundation/filemanager/…
【解决方案4】:

更简单的解决方案:

"~/Desktop/demo".expand.createDir()//Now you have a folder named demo on your desk

extension String{
    func createDir(_ path:String){
        do {
            try FileManager.default.createDirectory(atPath: path, withIntermediateDirectories: true, attributes: nil)
        } catch let error as NSError {
            NSLog("Unable to create directory \(error.debugDescription)")
        }
    }
    var expand:String {return NSString(string: self).expandingTildeInPath}
}

【讨论】:

    【解决方案5】:

    斯威夫特 4

    // DB Directory and Path
    lazy var applicationDocumentsDirectory: URL = {
    
        let urls = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
        let documentDirectoryURL = urls[urls.count - 1] as URL
        let dbDirectoryURL = documentDirectoryURL.appendingPathComponent("DB")
    
        if FileManager.default.fileExists(atPath: dbDirectoryURL.path) == false{
            do{
                try FileManager.default.createDirectory(at: dbDirectoryURL, withIntermediateDirectories: false, attributes: nil)
            }catch{
            }
        }
        return dbDirectoryURL
    }()
    

    【讨论】:

      【解决方案6】:

      对于其他开发人员,我将把它留在这里,因为它可以帮助像我这样的人寻找一种方法来确定文件夹的创建位置。

      let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray
      let documentsDir = paths.firstObject as String
      println("Path to the Documents directory\n\(documentsDir)")
      

      【讨论】:

        【解决方案7】:

        斯威夫特 4:

        NSSearchPathForDirectoriesInDomains 返回一个字符串数组,而不是 URL。

        将路径组件附加到字符串会使应用程序崩溃并显示消息 -[NSPathStore2 URLByAppendingPathComponent:]: 无法识别的选择器发送到实例

        这是一个可以编译的 Swift 4 版本:

            let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
            if let pathURL = URL.init(string: paths[0]) {
                let dataURL = pathURL.appendingPathComponent("MyFolder")
                do {
                    try FileManager.default.createDirectory(atPath: dataURL.absoluteString, withIntermediateDirectories: true, attributes: nil)
                } catch let error as NSError {
                    print(error.localizedDescription);
                }
            }
            else {
                print("Error in getting path URL");
            }
        

        【讨论】:

          【解决方案8】:

          斯威夫特 5

          guard let path = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).first else { return }
              if let pathURL = URL.init(string: path) {
                  let dataURL = pathURL.appendingPathComponent("MyFolderName")
                  do {
                      try FileManager.default.createDirectory(atPath: dataURL.absoluteString, withIntermediateDirectories: true, attributes: nil)
                  } catch let error as NSError {
                      print(error.localizedDescription);
                  }
              }
              else {
                  print("Error in URL path");
              }
          

          【讨论】:

            猜你喜欢
            • 2012-05-31
            • 2012-02-02
            • 2016-06-14
            • 1970-01-01
            • 1970-01-01
            • 2019-06-28
            • 2023-03-21
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多