Как проверить, что файл является защищенным паролем ZIP-файлом, используя C # - PullRequest
5 голосов
/ 29 октября 2009

Если указать путь к файлу, как я могу проверить, является ли файл защищенным паролем zip-файлом?

т.е. как бы я реализовал эту функцию?

bool IsPasswordProtectedZipFile(string pathToFile)

Мне не нужно разархивировать файл - мне просто нужно убедиться, что это ZIP-файл и он защищен паролем.

Спасибо

Ответы [ 4 ]

4 голосов
/ 29 октября 2009

Используя SharpZipLib , работает следующий код. Под работами я подразумеваю entry.IsCrypted, возвращает значение true или false в зависимости от того, существует ли пароль для первой записи в файле zip.

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 на CodeProject .

Таким образом, простая реализация выглядит примерно так:

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;
    }
}

Обратите внимание, что нет реальной обработки ошибок или чего-то еще ...

3 голосов
/ 29 октября 2009

В архивах 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;
    }
}
1 голос
/ 29 октября 2009

На данный момент в зрелости .NET Framework вам нужно будет использовать сторонний инструмент. Есть много коммерческих библиотек, которые можно гуглить. Я предлагаю один бесплатный с сайта Microsoft Codeplex DotNetZip . На первой странице написано " библиотека поддерживает пароли zip ".

0 голосов
/ 04 ноября 2015

Не существует 100% правильного способа проверить, все ли zip-записи зашифрованы. каждая запись в zip-файле независима и может иметь свой собственный пароль / зашифрованный метод.

В большинстве случаев zipfile заархивируется некоторым программным обеспечением, которое гарантирует, что каждая запись в zipfile имеет общий пароль и зашифрованный метод.

Таким образом, использование первого zipentry (не каталога) для проверки того, что этот zip-файл зашифрован, может охватывать большинство случаев.

...