我看起来是一个新的文件格式规范,规范说该文件可以是基于xml的文件,也可以是包含xml文件和其他文件的zip文件。
两种情况下的文件扩展名都相同。我可以通过哪些方法测试文件以确定它是否需要解压缩或只是阅读?
答案 0 :(得分:19)
zip文件格式由PKWARE定义。您可以找到他们的文件规范here。
在顶部附近,您会找到标题规范:
一个。本地文件头:
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指定“除非另有说明,否则所有值都以小端字节顺序存储。”,因此如果使用十六进制编辑器查看文件,您将看到50 4b 03 04 as前4个字节。
您可以使用它来检查您的文件是否是zip文件。如果在记事本中打开文件,您会注意到前两个字节(50和4b)是ASCII字符PK。
答案 1 :(得分:12)
您可以查看该文件的magic number。 ZIP存档的列表位于ZIP format wikipedia page:PK\003\004 or PK\005\006
。
答案 2 :(得分:1)
检查magic number文件的前几个字节。 Zip文件以PK开头(50 4B)。由于XML文件无法以这些字符开头且仍然有效,因此您可以非常确定文件类型。
答案 3 :(得分:1)
澄清一下,它以50 4b 03 04开始。
见http://www.pkware.com/documents/casestudies/APPNOTE.TXT(来自Simon P Stevens)
答案 4 :(得分:1)
您可以使用file查看它是文本文件(xml)还是可执行文件(zip)。 向下滚动以查看示例。
答案 5 :(得分:1)
虽然不是一个好的解决方案,但只是大声思考......怎么样:
try
{
LoadXmlFile(theFile);//Exception if not an xml file
}
catch(Exception ex)
{
LoadZipFile(theFile)
}
答案 6 :(得分:1)
您可以检查文件以查看它是否包含有效的XML标头。如果没有,请尝试解压缩。
答案 7 :(得分:0)
你可以尝试解压缩它 - 一个XML文件极不可能是一个有效的zip文件,或者可以检查神奇的数字,正如其他人所说的那样。
答案 8 :(得分:0)
这取决于你使用的是什么,但是zip库可能有一个测试文件是否是zip文件的函数 比如is_zip,test_file_zip或者其他......
或使用上面给出的幻数创建你自己的函数。