使用 7zip 检测文件是否为存档

本文关键字:是否 文件 7zip 检测 使用 | 更新日期: 2023-09-27 17:56:19

我想使用SevenZipSharp来确定文件是否是存档。我知道这是可能的,因为在资源管理器中,如果我将.zip重命名为 .bmp,7zip 仍然将其识别为存档。

-

-edit:换句话说,我希望7zip告诉我一个文件(无论扩展名如何)是否包含某种支持的存档(zip,tar,rar,iso等)。

谢谢菲德尔

使用 7zip 检测文件是否为存档

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

确定文件是否为存档的方法是实际尝试将其输入到SevenZipSharp库中,并查看它是成功还是失败。 但是,这将是一个非常缓慢的过程,就像您的示例一样,您有一堆标有扩展名.bmp的.zip文件。

你不需要使用 sevenzip 只知道文件是否是存档,检查各种文件的魔术字节就足够了。

例如:

Zip 的初始字节为 2 个字节 50 4B (PK)

RAR 的初始 3 个字节 52 61 72 (Rar!

SharpCompress也很容易做到这一点。

bool x = SevenZipArchive.IsSevenZipFile(File.OpenRead(path));
我没有

使用过那个库,而且没有文档的事实没有帮助,但通常有人尝试打开存档,如果出现任何错误,这可能意味着该文件不是存档(可能有特定的错误)。

我不熟悉SevenZipSharp,但ZIP是一种有据可查的文件格式,例如: ZIP 文件格式

记下文件和条目开头的幻数。您不需要任何特殊的 API/库来检测 zip 文件,只需将其作为普通文件读取并检查它是否符合格式即可。如果您不想解析整个文件,您可能会偷懒,只需检查文件签名是否是您正在寻找的文件签名(或其中一个): 文件签名列表

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