icsharpcode SharpZipLib没有在zip文件上正确设置密码

时间:2015-07-29 18:26:19

标签: c# .net icsharpcode

zip文件似乎在我的驱动器上成功创建,并包含我在filePaths[]

中指定的文件

问题在于,尽管设置密码为'hello',但当我尝试解压缩文件时,它会说密码不正确。

/// <summary>
    /// Creates a zip file
    /// </summary>
    /// <param name="filePaths">An array of files to add to the zip file</param>
    /// <param name="password">Password of zip file. Set to null to ignore</param>
    /// <param name="outputName">The name of the outputted zip file (including full path) </param>
    /// <returns></returns>
    public string CreateZip(string[] filePaths, string password, string outputName)
    {
        outputName += ".zip";

        using (var file = ZipFile.Create(outputName))
        {
            file.BeginUpdate();

            filePaths.ToList().ForEach(x =>
            {
                if (Path.HasExtension(x))
                {
                    file.Add(x);
                }

                else if (!Path.HasExtension(x) && Directory.Exists(x))
                {
                    Directory.GetFiles(x, "*.*", SearchOption.AllDirectories).ToList().ForEach(file.Add);
                }
            });

            file.Password = password;

            file.CommitUpdate();
            file.Close();

        }

        return outputName;
    }

有趣的是,只有当zip文件中的文件大小为0字节(它是一个空的xml文件)时,才会出现此问题。

如果我将内容添加到.xml文件并尝试使用我的函数对其进行压缩,则尽管在代码中指定了密码,但它根本不会要求输入密码。 (更有意思的是它在重置我的电脑后问我密码,并且它工作正常,但随后删除了所有文件并再次尝试解压缩时不要求密码)

1 个答案:

答案 0 :(得分:3)

我测试了您的代码并重现了该问题。在提交之前将 UseZip64 设置为开启为我做了诀窍:

file.Password = password;

file.UseZip64 = UseZip64.On;

file.CommitUpdate();
file.Close();

当它为动态或关闭时,它会对空文件产生相同的错误。