无法将文件从 Bundle 复制到 Documents Directory 子文件夹

Failing to copy file from Bundle to Documents Directory Subfolder

我使用以下代码创建了一个 Documents Directory 子文件夹:

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

这样做,子文件夹按预期创建。我通过打印 documents directory 内容来证明它显示了 HTML folder/file

然后我试图将应用 Bundle 中存在的另一个文件复制到这个创建的子文件夹,但不知何故我收到一条错误消息,指出无法将特定文件复制到 Documents 因为已存在同名项目。

这很令人困惑,因为即使在新安装时,没有任何复制的文件,它也说该文件存在,但如果我打印子文件夹内容,则什么也没有显示。

我正在尝试使用以下代码从 bundle 沙箱复制文件:

fileprivate func copyCSSFileToHTMLFolder() {
    guard let cssPath = Bundle.main.path(forResource: "swiss", ofType: ".css") else {
        print("css not found -- returning")
        return
    }
    let fileManager = FileManager.default

    if let tDocumentDirectory = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first {
        let filePath =  tDocumentDirectory.appendingPathComponent("HTML")
        if fileManager.fileExists(atPath: filePath.path) {
            do {
                try fileManager.copyItem(atPath: cssPath, toPath: filePath.path)
            } catch {
                print("\nFailed to copy css to HTML folder with error:", error)
            }
        }
    }
}

我做错了什么?

此致。

您需要创建完整路径,包括文件名。

变化:

let filePath =  tDocumentDirectory.appendingPathComponent("HTML")

至:

let filePath =  tDocumentDirectory.appendingPathComponent("HTML").appendingPathComponent(cssURL.lastPathComponent)

上述lastPathComponent的使用可以通过改变:

来实现
guard let cssPath = Bundle.main.path(forResource: "swiss", ofType: ".css") else {

至:

guard let cssURL = Bundle.main.url(forResource: "swiss", withExtension: "css") else {

当然在 copyItem 的调用中使用 cssURL.path