определение, является ли файл архивом, используя 7zip - PullRequest
2 голосов
/ 12 мая 2011

Я хотел бы использовать SevenZipSharp, чтобы определить, является ли файл архивом.Я знаю, что это возможно, потому что в проводнике, если я переименую .zip в .bmp, 7zip по-прежнему распознает его как архив.

- edit: Другими словами, я хочу, чтобы 7zip сообщал мне, если файл (независимо от расширения) содержит какой-либо поддерживаемый архив (zip, tar, rar, iso и т. д.)

Спасибо, Фидель

Ответы [ 7 ]

5 голосов
/ 12 мая 2011
static bool IsArchive(string filename)
{
    bool result = false;
    try
    {
        new ArchiveFile(File.OpenRead(filename));
        result = true;
    }
    catch
    {
        //log if you're going to do something about it
    }
    return result;
}
2 голосов
/ 27 сентября 2011

SharpCompress делает это также легко.

bool x = SevenZipArchive.IsSevenZipFile(File.OpenRead(path));
2 голосов
/ 12 мая 2011

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

Например:

Zip имеет начальные 2 байта 50 4B (PK)

RAR имеет начальные 3 байта 52 61 72 (Rar!)

2 голосов
/ 12 мая 2011

Чтобы определить, является ли файл архивом, нужно попытаться передать его в библиотеку SevenZipSharp и посмотреть, удастся ли ему это или нет.Однако это будет очень медленный процесс, как в вашем примере, у вас есть куча ZIP-файлов, помеченных с расширением .bmp.

0 голосов
/ 23 апреля 2019

7z.exe может использоваться, чтобы определить, является ли файл архивом:

static bool IsArchive(string filename)
{
    string _7z = @"C:\Program Files\7-Zip\7z.exe";

    bool result = false;
    using (Process p = new Process())
    {
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.RedirectStandardOutput = true;
        p.StartInfo.RedirectStandardError = true;
        p.StartInfo.FileName = _7z;
        p.StartInfo.Arguments = $"l \"{filename}\"";
        p.Start();
        string stdout = p.StandardOutput.ReadToEnd();
        string stderr = p.StandardError.ReadToEnd();

        if (stdout.Contains("Type = "))
        {
            result = true;
        }

        p.WaitForExit();
    }

    return result;
}
0 голосов
/ 12 мая 2011

Я не знаком с SevenZipSharp, но ZIP - это хорошо документированный формат файла, например: Формат файла ZIP

Запишите магические числа в начале файла и записи. Вам не нужно никакого специального API / библиотеки для обнаружения zip-файла, просто прочитайте его как обычный файл и проверьте, соответствует ли он формату. Если вам не нужно разбирать весь файл, вы можете быть ленивым и просто проверить, что подпись файла - это та, которую вы ищете ( Список подписей файлов * 1007). *

0 голосов
/ 12 мая 2011

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

...