我在iCloud的Docs文件夹中有两种类型的文件:
两种类型都使用.txt扩展名。 如何知道文件是否已编码?
由于我不知道文件是文本文件还是编码文件,所以首先我尝试打开任何文件,好像它是编码的一样,希望在open的完成处理程序中捕获任何错误:
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
这个例外是有道理的,因为我正在尝试解码文本文件(未编码的文件)。问题是我无法在swift中捕获异常,当我知道该文件不是编码文件时,为时已晚。
如何知道文件是否已编码?检测文件是否被编码从而进行编码的最佳方法是什么?
谢谢!
****** 解决方案 ******
基于来自@AlainCollins的评论,我读取了编码文件的前4个字节,因为这将是我的神奇数字:
var magicNumber = [UInt](count: 4, repeatedValue: 0)
data.getBytes(&magicNumber, length: 4 * sizeof(UInt))
然后,我将Docs文件夹中每个文件的前4个字节与这个幻数进行比较。
答案 0 :(得分:1)
如果您真的想知道文件的格式,请查看幻数:http://en.wikipedia.org/wiki/Magic_number_(programming)#Magic_numbers_in_files
如果您只想避免错误,请按照AJGM的try / catch建议进行操作。