我在 iCloud 的 Docs 文件夹中有两种类型的文件:
- 文本文件
- 使用 NSCoding 协议编码的文件
两种类型都使用 .txt 扩展名。如何知道文件是否已编码?
由于我不知道文件是文本文件还是编码文件,所以首先我尝试打开任何文件,就好像它已编码一样,希望在打开的完成处理程序上会捕获任何错误:
var doc = MyCloudDocumentType1(fileURL: url)
doc.openWithCompletionHandler { (success: Bool) -> Void in
if success {
println("Doc. opened")
}
}
当 UIDocument 尝试加载文件的内容时,尝试取消归档文本文件时出现异常:
override func loadFromContents(contents: AnyObject!, ofType typeName: String!, error outError: NSErrorPointer) -> Bool {
if (contents as NSData).length == 0 {
return false
}
NSKeyedUnarchiver.unarchiveObjectWithData(contents as NSData)
return true
}
异常被 触发NSKeyedUnarchiver.unarchiveObjectWithData(contents as NSData)
,表明存在无效参数:
'NSInvalidArgumentException', reason: '*** -[NSKeyedUnarchiver initForReadingWithData:]: incomprehensible archive
这个例外是有道理的,因为我正在尝试解码一个文本文件(一个未编码的文件)。问题是我无法迅速捕捉到异常,当我知道该文件不是编码文件时,为时已晚。
如何知道文件是否已编码?检测文件是否已编码并因此进行编码的最佳方法是什么?
谢谢!
****** 解决方案 ******
根据@AlainCollins 的评论,我读取了编码文件的前 4 个字节,因为这将是我的幻数:
var magicNumber = [UInt](count: 4, repeatedValue: 0)
data.getBytes(&magicNumber, length: 4 * sizeof(UInt))
然后,我将 Docs 文件夹中每个文件的前 4 个字节与这个幻数进行了比较。