【问题标题】:.NET 4.5 ZipFile class not producing consistent files.NET 4.5 ZipFile 类不产生一致的文件
【发布时间】:2014-01-18 18:50:07
【问题描述】:

也许我只是不理解 Zip 文件......这就是我所拥有的。我正在使用下面粘贴的代码来压缩我的 java 工作区并将其推送到网络驱动器。目的是我将在 PC 登录时运行此程序。我已经关闭了所有的 Java 窗口,我运行了两次该工具。根据 .NET 和我将它们复制到的 linux 系统,我生成了 2 个字节长度相同但 MD5 不同的 zip。

但是,当我手动使用 7zip 从我的 java 目录创建一个 zip 文件时,我会分别执行 2 次,并且这些文件具有相同的 MD5。

任何人都可以验证此问题或提供一些可能导致此问题的原因吗?据我了解,zip 文件应该是可重复的,算法中没有随机种子或任何东西。 这段代码是用 VS2012 编译的,并且在程序集中链接了 System.IO.Compression.FileSystem 东西。

 Public Sub New(sourceDir As String, baseName As String)
        s = sourceDir
        t = t + baseName + ".zip"
        ZipFile.CreateFromDirectory(s, t, Compression.CompressionLevel.NoCompression, False)
        Dim stream As IO.FileStream = IO.File.OpenRead(t)
        Dim md5 As System.Security.Cryptography.MD5 = System.Security.Cryptography.MD5.Create()
        hash = BitConverter.ToString(md5.ComputeHash(stream))
        md5.Dispose()
        stream.Close()
        Dim file As New System.IO.FileInfo(t)
        fname = baseName + "." + hash + ".zip"
        t = file.DirectoryName + "\" + fname
        file.MoveTo(t)
    End Sub

【问题讨论】:

  • 测试是否显示文件有效? ZIP 文件格式有一些未使用的字段,如果是,我可以想象它们中有垃圾,这会影响校验和。

标签: .net zip md5


【解决方案1】:

有点猜测,但 Zip 标头规范包含File last modification date/time 的字段。这很可能被设置为文件创建时间,这在两次运行之间会有所不同。

使用二进制文件编辑器检查是否属于这种情况很容易。

【讨论】:

  • 谢谢,我会调查一下,奇怪的是 7z 在不同时间创建的 zip 不会有这个问题。但这绝对是值得研究的事情。也许我可以根据windows覆盖它以使用文件夹的最后修改日期
  • 是的,看起来就是这样。我想我将不得不使用不同的存档格式或允许我声明日期时间字段的库。谢谢
猜你喜欢
  • 2012-12-22
  • 2015-07-21
  • 1970-01-01
  • 2012-01-16
  • 2019-11-13
  • 1970-01-01
  • 1970-01-01
  • 2017-06-10
  • 2011-12-17
相关资源
最近更新 更多