如何检查文件是否受密码保护&用户传递的密码是否正确使用c#中的dotnetzip

时间:2015-05-06 08:25:01

标签: c# dotnetzip

在我的应用程序中,我使用DotNetZip进行Zip&解压缩文件。 在提取文件之前,我想知道提供的密码是否正确。 现在我这样做。

foreach (var sourceFile in sourceFileNames) {
 ZipFile file = ZipFile.Read(sourceFile);
 foreach (ZipEntry entry in file.Entries) {
    if (FileSystem.Exists(conf.Target + entry.FileName)) {
       FileSystem.Delete(conf.Target + entry.FileName);
    }
    if (!string.IsNullOrEmpty(conf.Password)) {
       entry.Password = conf.Password;
    }
       entry.Extract(conf.Target);
 }
}

这里'sourceFileNames'包含zip文件列表

如果密码错误或未提供,那么它会出错但我不想这样做。

我想要做的是首先检查每个zip文件的密码&如果所有zip文件都有正确的密码,那么只能将它们全部解压缩。

2 个答案:

答案 0 :(得分:6)

顺便说一下,有一个静态方法来检查Zip文件的密码:

public static bool Ionic.Zip.ZipFile.CheckZipPassword(
    string zipFileName,
    string password
)

答案 1 :(得分:3)

也许您可以尝试this solution

  

我们通过扩展MemoryStream并覆盖了这个问题来解决这个问题   Write()方法。

     

根据the forum post here,DotNetZip代码将抛出   尝试ZipEntry的前几个字节后的异常   密码不正确。

     

因此,如果对Extract()的调用曾调用我们的Write()方法,那么我们就是这样   知道密码有效。这是代码片段:

public class ZipPasswordTester
{
    public bool CheckPassword(Ionic.Zip.ZipEntry entry, string password)
    {
        try
        {
            using (var s = new PasswordCheckStream())
            {
                entry.ExtractWithPassword(s, password);
            }
            return true;
        }
        catch (Ionic.Zip.BadPasswordException)
        {
            return false;
        }
        catch (PasswordCheckStream.GoodPasswordException)
        {
            return true;
        }
    }

    private class PasswordCheckStream : System.IO.MemoryStream
    {
        public override void Write(byte[] buffer, int offset, int count)
        {
            throw new GoodPasswordException();
        }

        public class GoodPasswordException : System.Exception { }
    }
}