我正在寻找一个新的文件格式规范,规范说该文件可以是基于 xml 的文件,也可以是包含 xml 文件和其他文件的 zip 文件。
两种情况下的文件扩展名相同。我可以通过哪些方式测试文件以确定它是否需要解压缩或只是读取?
我正在寻找一个新的文件格式规范,规范说该文件可以是基于 xml 的文件,也可以是包含 xml 文件和其他文件的 zip 文件。
两种情况下的文件扩展名相同。我可以通过哪些方式测试文件以确定它是否需要解压缩或只是读取?
zip 文件格式由 PKWARE 定义。您可以在此处找到他们的文件规范。
在顶部附近,您会找到标头规范:
A. 本地文件头:
local file header signature 4 bytes (0x04034b50) version needed to extract 2 bytes general purpose bit flag 2 bytes compression method 2 bytes last mod file time 2 bytes last mod file date 2 bytes crc-32 4 bytes compressed size 4 bytes uncompressed size 4 bytes file name length 2 bytes extra field length 2 bytes file name (variable size) extra field (variable size)
从这里你可以看到头的前 4 个字节应该是文件签名,应该是十六进制值 0x04034b50。文件中的字节顺序是相反的——PKWARE 指定“所有值都以 little-endian 字节顺序存储,除非另有说明。”因此,如果您使用十六进制编辑器查看文件,您将看到 50 4b 03 04 为前 4 个字节。
您可以使用它来检查您的文件是否为 zip 文件。如果您在记事本中打开文件,您会注意到前两个字节(50 和 4b)是 ASCII 字符 PK。
您可以查看文件的幻数。ZIP 档案的档案列在ZIP 格式的维基百科页面上:PK\003\004 or PK\005\006
.
检查文件的前几个字节是否有幻数。Zip 文件以 PK (50 4B) 开头。由于 XML 文件不能以这些字符开头并且仍然有效,因此您可以相当确定文件类型。
澄清一下,它以 50 4b 03 04 开头。
请参阅http://www.pkware.com/documents/casestudies/APPNOTE.TXT(来自 Simon P Stevens)
您可以使用文件来查看它是文本文件(xml)还是可执行文件(zip)。向下滚动以查看示例。
虽然不是一个好的解决方案,但只是考虑负载......怎么样:
try
{
LoadXmlFile(theFile);//Exception if not an xml file
}
catch(Exception ex)
{
LoadZipFile(theFile)
}
您可以检查文件以查看它是否包含有效的 XML 标头。如果没有,请尝试解压缩它。
有关 XML 规范,请参阅单击此处。
您可以尝试解压缩它 - XML 文件极不可能是有效的 zip 文件,或者可以检查幻数,正如其他人所说。
这取决于您使用的是什么,但 zip 库可能具有测试文件是否是 zip 文件的功能,例如 is_zip、test_file_zip 或其他什么...
或使用上面给出的幻数创建您自己的函数。