2

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

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

谢谢,菲德尔

4

7 回答 7

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;
}
于 2011-05-12T13:37:17.193 回答
2

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

于 2011-05-12T13:25:29.630 回答
2

您无需使用 Sevenzip 仅知道文件是否为存档文件,只需检查各种文件的魔术字节即可。

例如:

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

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

于 2011-05-12T13:27:09.807 回答
2

SharpCompress也很容易做到这一点。

bool x = SevenZipArchive.IsSevenZipFile(File.OpenRead(path));
于 2011-09-27T08:35:47.200 回答
0

我没有使用过该库,并且没有文档这一事实也无济于事,但通常会尝试打开存档,如果出现任何错误,则可能意味着该文件不是存档(可能存在特定错误那)。

于 2011-05-12T13:27:44.830 回答
0

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

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

于 2011-05-12T13:33:15.680 回答
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;
}
于 2019-04-23T13:31:13.157 回答