如何在创建Zip文件时忽略时间戳?

时间:2017-08-24 13:10:21

标签: c#

我有多个服务器同样生成一些文件/文件夹数据的任务,需要在回调之前打包它,然后区分它,但偶然发现两个相同数据文件夹创建两个不同档案的问题。我正在使用这个功能:

ZipFile.CreateFromDirectory(...) 

这适用于不同文件夹中的相同数据:

C:\a\data\* 
C:\b\data\*

这会创建两个不同的zip存档,唯一​​不同的是它们的页眉和页脚。但是,如果我从单个文件夹创建两个档案 - 它是相同的。我想一些时间戳(创建数据,修改数据等)被写入存档。

如何指定从相同数据创建的档案应该相同? (忽略全局元信息)

1 个答案:

答案 0 :(得分:0)

嗯,通过手动从文件夹创建存档,并设置条目的最后修改时间,问题很容易解决:

    public static void ZipDirectory(string input, string output, CompressionLevel level)
    {

        input = Path.GetFullPath(input);
        using (var fs = File.OpenWrite(output))
        using (var za = new ZipArchive(fs, ZipArchiveMode.Create))
        {
            foreach (var filePath in Directory.GetFiles(input, "*", SearchOption.AllDirectories).OrderBy(x => x))
            {
                var name = filePath.Replace(input, "").TrimStart('\\', '/');
                var e = za.CreateEntry(name, level);
                using (var zes = e.Open())
                {
                    using (var fes = File.OpenRead(filePath))
                    {
                        fes.CopyTo(zes);
                    }
                }
            }
        }

        using (var za = ZipFile.Open(output, ZipArchiveMode.Update))
        {
            foreach (var e in za.Entries)
            {
                e.LastWriteTime = new DateTimeOffset(1980, 1, 1, 0, 0, 0, 0, TimeSpan.Zero);
            }
        }
    }

这样,我的zip存档会忽略有关文件的任何不相关的元信息。