我正在寻找一种新的文件格式规范,规范说明文件可以是基于xml的,也可以是一个包含xml文件和其他文件的zip文件。
两种情况下的文件扩展名相同。有哪些方法可以测试文件以决定是否需要解压缩还是直接读取?
我正在寻找一种新的文件格式规范,规范说明文件可以是基于xml的,也可以是一个包含xml文件和其他文件的zip文件。
两种情况下的文件扩展名相同。有哪些方法可以测试文件以决定是否需要解压缩还是直接读取?
ZIP文件格式是由PKWARE定义的。你可以在这里找到他们的文件规范。
在文档的最上面,你将会找到头部规范:
A. 本地文件头:
根据这段内容,可以看出文件头的前4个字节应该是文件签名,其十六进制值应为0x04034b50。文件中的字节顺序相反 - PKWARE指定“所有值都存储在小端字节顺序中,除非另有说明。”因此,如果您使用十六进制编辑器查看文件,则会看到50 4b 03 04作为前4个字节。 您可以使用这个方法来检查文件是否为zip文件。如果您在记事本中打开文件,您会注意到前两个字节(50和4b)是ASCII字符PK。
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)
你可以查看文件的魔数(magic number)。ZIP归档文件的魔数列在ZIP格式维基百科页面上: PK\003\004 或 PK\005\006
。
虽然不是一个好的解决方案,但只是随便想一下...怎么样:
try
{
LoadXmlFile(theFile);//Exception if not an xml file
}
catch(Exception ex)
{
LoadZipFile(theFile)
}
检查文件的前几个字节,查看魔数。Zip文件以PK(50 4B)开头。由于XML文件不能以这些字符开头并仍然有效,因此您可以相当确定文件类型。
为了澄清,它以50 4b 03 04开头。
请参见http://www.pkware.com/documents/casestudies/APPNOTE.TXT(来自Simon P Stevens)
您可以尝试解压缩它——XML 文件极不可能是有效的 zip 文件,或者可以像其他人所说的那样检查魔数。
这取决于你使用的是什么,但 zip 库可能有一个函数来测试文件是否为 zip 文件,像 is_zip、test_file_zip 或其他类似的函数。
或者通过使用上面给出的魔数创建自己的函数。