给定文件的路径,如何验证该文件是受密码保护的zip文件?
即,我该如何实现这个功能?
bool IsPasswordProtectedZipFile(string pathToFile)
我不需要解压缩文件 - 我只需要验证它是ZIP并且已经受到一些密码的保护。
由于
答案 0 :(得分:4)
使用SharpZipLib,以下代码有效。根据作品,我的意思是entry.IsCrypted
根据zip文件中第一个条目是否有密码返回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;
}
}
请注意,没有真正的错误处理或其他任何内容......
答案 1 :(得分: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;
}
}
答案 2 :(得分:1)
在.NET Framework成熟度的这一点上,您将需要使用第三方工具。有很多商业图书馆可以用Google搜索。我建议微软的Codeplex网站DotNetZip免费提供一个。首页说明“该库支持zip密码”。
答案 3 :(得分:0)
没有100%正确的方法可以检查所有zip条目是否都已加密。 zipfile中的每个条目都是独立的,可以有自己的密码/加密方法。
对于大多数情况,zipfile被某些软件压缩,这些软件将确保zipfile中的每个条目都有一个通用密码和加密方法。
因此,使用第一个zipentry(不是目录)来检查该zipfile是否已加密可以涵盖大多数情况。