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

时间:2011-05-12 13:19:36

标签: c# file archive 7zip sevenzipsharp

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

- 编辑:换句话说,我想让7zip告诉我文件(无论扩展名)是否包含某种受支持的存档(zip,tar,rar,iso等)。

谢谢, 卡斯

7 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

您确定文件是否为存档的方式是实际尝试将其提供给SevenZipSharp库,并查看它是成功还是失败。然而,这将是一个非常缓慢的过程,就像你的例子中你有一堆标有扩展名.bmp的.zip文件。

答案 2 :(得分:2)

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

例如:

Zip最初有2个字节50 4B(PK)

RAR最初有3个字节52 61 72(Rar!)

答案 3 :(得分:2)

SharpCompress也很容易做到这一点。

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

我不熟悉SevenZipSharp,但ZIP是一种记录良好的文件格式,例如:ZIP File Format

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

答案 6 :(得分:0)

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