第二次复制文件时,Swfit FileManager与EXC_BAD_ACCESS崩溃

时间:2018-05-04 14:10:03

标签: swift macos nsfilemanager

我正在编写一个MacOS应用程序,其中一个进程在Application Support目录中创建一个临时文件夹,在该文件夹中生成一些新文件,然后将一些用户指定的文件复制到其中,然后最终复制完整我的临时文件夹的内容进入用户指定的最终位置。在启动应用程序后第一次运行此导出过程时,一切都运行良好,但如果多次运行,则会因EXC_BAD_ACCESS错误而崩溃。始终创建并编写应用程序生成的文件,但是当FileManager尝试复制现有的用户选择的文件之一时,总是会发生崩溃,即使它通过我的guard语句检查现有文件是否可读并且目标路径是可写的。如果您重新启动该应用程序,它将在第一次没有问题时再次运行,但会崩溃第二次。

以下是相关代码:

let fm = FileManager.default
guard let existingINIURL = currentExportProfile!.existingINIFileURL else {
    return (false, "No INI file location provided.")
}

guard fm.fileExists(atPath: existingINIURL.path), fm.isReadableFile(atPath: existingINIURL.path) else {
    return (false, "Could not find INI file at specified path: \(existingINIURL.path) or path is not readable.")
}

guard let outputURL = exportTempFilesURL?.appendingPathComponent("OUTPUT", isDirectory: true), fm.fileExists(atPath: outputURL.path) else {
    return (false, "Problem accessing temp staging path")
}

guard fm.isReadableFile(atPath: existingINIURL.path) else {
    return (false, "Existing file is not readable")
}

guard fm.isWritableFile(atPath: outputURL.path) else {
    return (false, "Destination \(outputURL.path) is not writable")
}

do {
    try fm.copyItem(at: existingINIURL, to: outputURL.appendingPathComponent("CONTROL.INI"))
    return (true, nil)
} catch let error as NSError {
    Swift.print("Failed to copy existing INI with error: \(error)")
    return (false, "Failed to copy existing INI file with error: \(error)")
}

EXC_BAD_ACCESS崩溃始终发生在以下行:

try fm.copyItem(at: existingINIURL, to: outputURL.appendingPathComponent("CONTROL.INI"))

因为它是一个访问错误,当然它永远不会到达catch语句给我任何问题的迹象。

有趣的说明:我尝试使用其当前名称复制文件,然后在单独的步骤中重命名复制的文件,而不是使用.appendingPathComponent("CONTROL.INI")进行复制。当我这样做时,它似乎首先工作,但它实际上只是使它工作可能3-4次然后以相同的方式崩溃而不是总是崩溃第二次尝试同样的错误,仍然在{{ 1}}行。

有没有人遇到过与FileManager类似的问题?

谢谢!

1 个答案:

答案 0 :(得分:0)

我明白了。这是因为我忘了我在默认的FileManager上设置了一个委托,在第一个循环后不再存在。在我更改了需要委托使用自己的FileManager实例的功能后,问题就消失了。