1

我在 iCloud 的 Docs 文件夹中有两种类型的文件:

  1. 文本文件
  2. 使用 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 个字节与这个幻数进行了比较。

4

1 回答 1

1

如果您真的想知道文件的格式,请查看幻数:http ://en.wikipedia.org/wiki/Magic_number_(programming)#Magic_numbers_in_files

如果您只想在错误中幸存下来,请遵循 AJGM 的 try/catch 建议。

于 2014-09-03T18:14:36.433 回答