【发布时间】:2018-05-31 20:57:44
【问题描述】:
我有一个应用程序在使用 FileHandle 打开文件进行读取时不一致地返回“nil”。我在 OSX (10.13.4)、XCode 9.4、Swift 4.1
此 OSX 应用程序使用 NSOpenPanel() 来获取用户选择的文件列表。我的“模型”类代码打开这些文件以构建数据结构的集合。执行此操作的代码以这样的方式开始,每次都成功地为任何文件获取 FileHandle,并且能够从文件中读取数据。
private func getFITHeader(filename: String) {
let file: FileHandle? = FileHandle(forReadingAtPath: filename)
if file == nil {
print("FITFile >>> File open failed for file \(filename)")
}
else {
var databuffer: Data
databuffer = (file?.readData(ofLength: 80))!
:
:
}
这些文件还包含我在应用程序的另一部分处理的二进制数据块。当我为此开发代码时,出于测试目的,我暂时对与上述工作相同的文件名之一进行硬编码。但是这段代码(如下)总是抛出异常'Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value' 当它到达 fileHandle?.seek() - 出于某种原因尝试尽管代码在功能上与上述相同,但创建 FileHandle 始终返回“nil”。
@IBAction func btnProcFile(_ sender: Any) {
var data: Data
let filename = "/Users/johncneal/Dropbox/JN Astronomy/Astronomy/Spectroscopy/RSpec_Analyses/Gamma_Cas/20161203/Gamma Cas_065.fit"
let fileHandle: FileHandle? = FileHandle(forReadingAtPath: filename)
fileHandle?.seek(toFileOffset: 2880) //skip past the headers
let dataLenToRead = 1391 * 1039 * 2
data = (fileHandle?.readData(ofLength: dataLenToRead))!
:
:
}
第二个函数中的代码在 Playground 中可以正常工作(没有附加太多含义),而且奇怪的是,在临时添加到不同项目时也可以正常工作。可能还值得一提的是文件路径的长度似乎并不重要 - 它在短路径上的行为相同。
所以问题是 - 为什么 FileHandle 的这种行为可靠地不一致?
print()'ing 提供给 FileHandle() 的文件名表明它们在每种情况下都是相同的(见下文)。所以我对此感到困惑和沮丧 - 任何观点或解决方法都会受到赞赏。
/Users/johncneal/Dropbox/JN 天文学/天文学/光谱学/RSpec_Analyses/Gamma_Cas/20161203/Gamma Cas_065.fit
/Users/johncneal/Dropbox/JN 天文学/天文学/光谱学/RSpec_Analyses/Gamma_Cas/20161203/Gamma Cas_065.fit
【问题讨论】:
-
如果
fileHandle是nil,则fileHandle?.seek行不能抛出该错误。使用调试器。如果fileHandle真的是nil?