2009-10-28 149 views
3

给定一个文件路径,如何验证该文件是受密码保护的zip文件?如何使用C#验证文件是否为受密码保护的ZIP文件

即,我将如何实现此功能?

bool IsPasswordProtectedZipFile(string pathToFile) 

我不需要解压缩文件 - 我只需要验证它是一个ZIP,并已用一些密码保护。

谢谢

+0

看到这个问题:[如何在c#程序中使用密码进行压缩和解压缩](http://stackoverflow.com/questions/1607858/how-to-zip-and-unzip-using-password-in-c-程序) – manji 2009-10-28 21:38:54

回答

3

使用SharpZipLib,以下代码工作。根据作品,我的意思是entry.IsCrypted根据压缩文件中第一个条目是否存在密码来返回true或false。

var file = @"c:\testfile.zip"; 
FileStream fileStreamIn = new FileStream(file, FileMode.Open, FileAccess.Read); 
ZipInputStream zipInStream = new ZipInputStream(fileStreamIn); 
ZipEntry entry = zipInStream.GetNextEntry(); 
Console.WriteLine("IsCrypted: " + entry.IsCrypted); 

有上CodeProject使用SharpZipLib一个简单的教程。

这样一个简单的实现看起来是这样的:

public static bool IsPasswordProtectedZipFile(string path) 
{ 
    using (FileStream fileStreamIn = new FileStream(path, FileMode.Open, FileAccess.Read)) 
    using (ZipInputStream zipInStream = new ZipInputStream(fileStreamIn)) 
    { 
     ZipEntry entry = zipInStream.GetNextEntry(); 
     return entry.IsCrypted; 
    } 
} 

注意有没有真正的错误处理或什么...

+0

谢谢 - 我现在意识到的关键点是我需要查看ZIP中的单个条目,因为它们可以单独加密。密码不适用于整个ZIP文件。 Codeplex的DotNetZip也具有类似的功能。 – frankadelic 2009-10-29 05:39:42

+0

是的,确切地说。因此,例如,您可能想要扫描整个存档,查找具有密码的_any_条目,而不仅仅是第一个... – 2009-10-29 08:15:25

1

在.NET Framework成熟度的这一点上,您将需要使用第三方工具。有许多商业图书馆可以谷歌搜索。我建议从微软的Codeplex网站DotNetZip免费提供一个。首页陈述“该库支持邮编密码”。

3

在ZIP档案,密码不放在文件,但在文件中的单个条目。一个zip可以包含一些条目加密,有些则不是。下面是一些示例代码中DotNetZip检查加密的条目:

int encryptedEntries = 0; 
using (var zip = ZipFile.Read(nameOfZipFile)) 
{ 
    // check a specific, named entry: 
    if (zip["nameOfEntry.doc"].UsesEncryption) 
     Console.WriteLine("Entry 'nameOfEntry.doc' uses encryption"); 

    // check all entries: 
    foreach (var e in zip) 
    { 
     if (e.UsesEncryption) 
     { 
      Console.WriteLine("Entry {0} uses encryption", e.FileName); 
      encryptedEntries++; 
     } 
    } 
} 

if (encryptedEntries > 0) 
    Console.WriteLine("That zip file uses encryption on {0} entrie(s)", encryptedEntries); 

如果你愿意,你可以使用LINQ:

private bool ZipUsesEncryption(string archiveToRead) 
{ 
    using (var zip = ZipFile.Read(archiveToRead)) 
    { 
     var selection = from e in zip.Entries 
      where e.UsesEncryption 
      select e; 

     return selection.Count > 0; 
    } 
} 
+0

谢谢。我也发现了这个DotNetZip解决方案 - 请参阅上面接受的答案中的我的评论。 – frankadelic 2009-10-29 16:24:50

0

还有就是要检查是否所有的拉链没有100%的正确方法条目被加密。 zipfile中的每个条目都是独立的,并且可以拥有自己的密码/加密方法。

对于大多数情况下,zipfile被一些软件压缩,这些软件将确保zipfile中的每个条目都有一个公用密码和加密方法。

因此,使用第一个zipentry(不是目录)来检查该zip文件是否被加密可以覆盖大多数情况。