在我的应用程序中,我使用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文件都有正确的密码,那么只能将它们全部解压缩。
答案 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 { }
}
}