给定一个文件路径,如何验证该文件是受密码保护的zip文件?如何使用C#验证文件是否为受密码保护的ZIP文件
即,我将如何实现此功能?
bool IsPasswordProtectedZipFile(string pathToFile)
我不需要解压缩文件 - 我只需要验证它是一个ZIP,并已用一些密码保护。
谢谢
给定一个文件路径,如何验证该文件是受密码保护的zip文件?如何使用C#验证文件是否为受密码保护的ZIP文件
即,我将如何实现此功能?
bool IsPasswordProtectedZipFile(string pathToFile)
我不需要解压缩文件 - 我只需要验证它是一个ZIP,并已用一些密码保护。
谢谢
使用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;
}
}
注意有没有真正的错误处理或什么...
谢谢 - 我现在意识到的关键点是我需要查看ZIP中的单个条目,因为它们可以单独加密。密码不适用于整个ZIP文件。 Codeplex的DotNetZip也具有类似的功能。 – frankadelic 2009-10-29 05:39:42
是的,确切地说。因此,例如,您可能想要扫描整个存档,查找具有密码的_any_条目,而不仅仅是第一个... – 2009-10-29 08:15:25
在.NET Framework成熟度的这一点上,您将需要使用第三方工具。有许多商业图书馆可以谷歌搜索。我建议从微软的Codeplex网站DotNetZip免费提供一个。首页陈述“该库支持邮编密码”。
在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;
}
}
谢谢。我也发现了这个DotNetZip解决方案 - 请参阅上面接受的答案中的我的评论。 – frankadelic 2009-10-29 16:24:50
还有就是要检查是否所有的拉链没有100%的正确方法条目被加密。 zipfile中的每个条目都是独立的,并且可以拥有自己的密码/加密方法。
对于大多数情况下,zipfile被一些软件压缩,这些软件将确保zipfile中的每个条目都有一个公用密码和加密方法。
因此,使用第一个zipentry(不是目录)来检查该zip文件是否被加密可以覆盖大多数情况。
看到这个问题:[如何在c#程序中使用密码进行压缩和解压缩](http://stackoverflow.com/questions/1607858/how-to-zip-and-unzip-using-password-in-c-程序) – manji 2009-10-28 21:38:54