【问题标题】:Create Directory in Swift 3.0在 Swift 3.0 中创建目录
【发布时间】:2017-04-30 23:08:39
【问题描述】:

我是 9 年级的新学生,正在学习 swift,正在创建一个学校项目。

我正在尝试创建一个目录,我想在其中将扫描的文件保存为 pdf 格式。

创建目录时出现以下错误。

错误一:

不能在属性初始化器中使用实例成员“filemgr”;属性初始化程序在 'self' 可用之前运行。

错误 2:

预期声明

代码:

let filemgr = FileManager.default


let dirPaths = filemgr.urls(for: .documentDirectory, in: .userDomainMask)

let docsURL = dirPaths[0]

let newDir = docsURL.appendingPathComponent("data").path

do{
    try filemgr.createDirectory(atPath: newDir,withIntermediateDirectories: true, attributes: nil)
} catch {
    print("Error: \(error.localizedDescription)")
}

请帮助我解决这个问题。

谢谢。

【问题讨论】:

标签: ios swift swift3


【解决方案1】:

请使用此代码:

Swift 5.0Swift 4.0斯威夫特 3.0

let DocumentDirectory = NSURL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0])
let DirPath = DocumentDirectory.appendingPathComponent("FOLDER_NAME")
do
{
    try FileManager.default.createDirectory(atPath: DirPath!.path, withIntermediateDirectories: true, attributes: nil)
}
catch let error as NSError
{
    print("Unable to create directory \(error.debugDescription)")
}
print("Dir Path = \(DirPath!)")

【讨论】:

  • 从日志看起来像是创建目录,如何从 GUI 访问它以存储扫描仪捕获的文件或图片?
【解决方案2】:

对于 Swift 4.0 请使用这个

    let fileManager = FileManager.default
    if let tDocumentDirectory = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first {
        let filePath =  tDocumentDirectory.appendingPathComponent("\(FOLDER_NAME)") 
        if !fileManager.fileExists(atPath: filePath.path) {
            do {
                try fileManager.createDirectory(atPath: filePath.path, withIntermediateDirectories: true, attributes: nil)
            } catch {
                NSLog("Couldn't create document directory")
            }
        }
        NSLog("Document directory is \(filePath)")
    }

【讨论】:

  • 我得到了`Cannot invoke 'appendingPathComponent' without arguments`
【解决方案3】:

对于 Swift 4.0,我在 URL 之外创建了以下扩展,允许在应用程序内的文档目录之外创建文件夹。

import Foundation

extension URL {
    static func createFolder(folderName: String) -> URL? {
        let fileManager = FileManager.default
        // Get document directory for device, this should succeed
        if let documentDirectory = fileManager.urls(for: .documentDirectory,
                                                    in: .userDomainMask).first {
            // Construct a URL with desired folder name
            let folderURL = documentDirectory.appendingPathComponent(folderName)
            // If folder URL does not exist, create it
            if !fileManager.fileExists(atPath: folderURL.path) {
                do {
                    // Attempt to create folder
                    try fileManager.createDirectory(atPath: folderURL.path,
                                                    withIntermediateDirectories: true,
                                                    attributes: nil)
                } catch {
                    // Creation failed. Print error & return nil
                    print(error.localizedDescription)
                    return nil
                }
            }
            // Folder either exists, or was created. Return URL
            return folderURL
        }
        // Will only be called if document directory not found
        return nil
    }
}

如果所需的文件夹不存在,它将创建它。然后,假设该文件夹存在,它会将URL 返回给用户。否则,如果失败,则返回nil

例如,要创建文件夹“MyStuff”,您可以这样称呼它:

let myStuffURL = URL.createFolder(folderName: "MyStuff")

这将返回:

file:///var/mobile/Containers/Data/Application/4DE0A1C0-8629-47C9-87D7-C2B4F3A16D24/Documents/MyStuff/

您还可以使用以下内容创建嵌套文件夹:

let myStuffHereURL = URL.createFolder(folderName: "My/Stuff/Here")

这给了你:

file:///var/mobile/Containers/Data/Application/4DE0A1C0-8629-47C9-87D7-C2B4F3A16D24/Documents/My/Stuff/Here/

【讨论】:

    【解决方案4】:

    你得到这个是因为你在错误的地方为 newDir 实例赋值。

    我在viewDidLoad 中编写了您的代码,它运行良好。

    【讨论】:

    • 我在视图控制器中创建了一个动作,带有一个名为“创建目录”的按钮。该代码可以正常工作,并在 file:///var/mobile/Containers/Data/Application/EB48367A-80E3-4714-955D-3284E4D28F0A/Documents/data/ 处创建一个目录。我如何访问此目录并通过 GUI(Main.storyboard)将文件保存到其中。谢谢
    【解决方案5】:

    适用于 Swift 5 及更高版本

    let documentDirectoryURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
    let directoryURL = documentDirectoryURL.appendingPathComponent("FolderName", isDirectory: true)
            
            if FileManager.default.fileExists(atPath: directoryURL.path) {
                 print(directoryURL.path)
            } else {
                do {
                    try FileManager.default.createDirectory(at: directoryURL, withIntermediateDirectories: true, attributes: nil)
                    print(directoryURL.path)
                } catch {
                    print(error.localizedDescription)
                }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-26
      • 2014-04-21
      • 2017-11-24
      • 1970-01-01
      • 2015-12-23
      • 1970-01-01
      相关资源
      最近更新 更多