13

我正在寻找一个新的文件格式规范,规范说该文件可以是基于 xml 的文件,也可以是包含 xml 文件和其他文件的 zip 文件。

两种情况下的文件扩展名相同。我可以通过哪些方式测试文件以确定它是否需要解压缩或只是读取?

4

9 回答 9

23

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。

于 2009-12-11T10:18:19.197 回答
12

您可以查看文件的幻数。ZIP 档案的档案列在ZIP 格式的维基百科页面上PK\003\004 or PK\005\006.

于 2009-12-11T10:09:28.747 回答
1

检查文件的前几个字节是否有幻数。Zip 文件以 PK (50 4B) 开头。由于 XML 文件不能以这些字符开头并且仍然有效,因此您可以相当确定文件类型。

于 2009-12-11T10:09:36.097 回答
1

归档幻数

澄清一下,它以 50 4b 03 04 开头。

请参阅http://www.pkware.com/documents/casestudies/APPNOTE.TXT(来自 Simon P Stevens)

于 2009-12-11T10:12:05.560 回答
1

您可以使用文件来查看它是文本文件(xml)还是可执行文件(zip)。向下滚动以查看示例。

于 2009-12-11T10:12:29.723 回答
1

虽然不是一个好的解决方案,但只是考虑负载......怎么样:

try
{
LoadXmlFile(theFile);//Exception if not an xml file
}
catch(Exception ex)
{
LoadZipFile(theFile)
}
于 2009-12-11T10:49:50.770 回答
1

您可以检查文件以查看它是否包含有效的 XML 标头。如果没有,请尝试解压缩它。

有关 XML 规范,请参阅单击此处。

于 2009-12-11T20:15:13.513 回答
0

您可以尝试解压缩它 - XML 文件极不可能是有效的 zip 文件,或者可以检查幻数,正如其他人所说。

于 2009-12-11T10:10:53.550 回答
0

这取决于您使用的是什么,但 zip 库可能具有测试文件是否是 zip 文件的功能,例如 is_zip、test_file_zip 或其他什么...

或使用上面给出的幻数创建您自己的函数。

于 2009-12-11T10:14:51.513 回答