如何知道文件是否被编码?

时间:2014-09-03 18:10:01

标签: ios swift nscoding uidocument nskeyedunarchiver

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

  1. 文本文件
  2. 使用NSCoding协议编码的文件
  3. 两种类型都使用.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个字节与这个幻数进行比较。

1 个答案:

答案 0 :(得分:1)

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

如果您只想避免错误,请按照AJGM的try / catch建议进行操作。