C# 如何使用C验证文件是否为受密码保护的ZIP文件#

C# 如何使用C验证文件是否为受密码保护的ZIP文件#,c#,encryption,compression,zip,passwords,C#,Encryption,Compression,Zip,Passwords,给定文件的路径,如何验证该文件是否为受密码保护的zip文件 i、 例如,我将如何实现此功能 bool IsPasswordProtectedZipFile(string pathToFile) 我不需要解压这个文件——我只需要验证它是一个ZIP文件,并且已经用一些密码进行了保护 谢谢在.NET Framework成熟的这一点上,您需要使用第三方工具。有许多商业图书馆可以用谷歌搜索。我建议从微软的Codeplex网站上买一个免费的。首页声明“库支持zip密码”。使用以下代码可以工作。我所说的wo

给定文件的路径,如何验证该文件是否为受密码保护的zip文件

i、 例如,我将如何实现此功能

bool IsPasswordProtectedZipFile(string pathToFile)
我不需要解压这个文件——我只需要验证它是一个ZIP文件,并且已经用一些密码进行了保护


谢谢

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

使用以下代码可以工作。我所说的works是指
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);
有一个关于在上使用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可以包含一些加密的条目,也可以包含一些未加密的条目。下面是一些示例代码,用于检查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;
    }
}

没有100%正确的方法来检查所有zip条目是否加密。 zipfile中的每个条目都是独立的,可以有自己的密码/加密方法

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


因此,使用第一个ZipPentry(不是目录)检查zipfile是否加密可以覆盖大多数情况。

谢谢-我现在意识到的关键点是,我需要查看ZIP中的各个条目,因为它们可以单独加密。密码不适用于整个ZIP文件。codeplex的DotNetZip也有类似的功能。是的,没错。因此,例如,您可能希望扫描整个归档文件,查找任何具有密码的条目,而不仅仅是第一个……谢谢。我也找到了这个DotNetZip解决方案-请参阅我在上面接受的答案中的评论。请参阅以下问题: