【问题标题】:detecting if a file is an archive using 7zip使用 7zip 检测文件是否为存档
【发布时间】:2011-08-24 03:05:00
【问题描述】:

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

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

谢谢, 菲德尔

【问题讨论】:

    标签: c# file archive 7zip sevenzipsharp


    【解决方案1】:
    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】:

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

      【讨论】:

      • 谢谢尼克 - 是的,我试过了:SevenZip.SevenZipExtractor e = new SevenZip.SevenZipExtractor(fullFilename);,但是它抛出一个异常说:“扩展 .BMP 不是受支持的存档文件扩展名。” .奇怪的是,它有一个有效扩展名列表。
      • 正在挖掘源代码,似乎该库最初并不关注扩展。它运行“CheckSignature”,检查文件的初始字节以尝试将其与支持的格式匹配。如果失败,它会显示一条错误消息,就像你得到的那样。如果您所做的只是将 .zip 文件重命名为 .bmp 并开始失败,则可能是库中的错误。当文件具有 .zip 扩展名时它是否有效?
      • @Fidel - 我不知道,因为我没有尝试过,但我怀疑如果你将 STREAM 传递给 SevenZipExtractor (就像 SLaks 在被接受的答案中建议的那样)而不是FILENAME,然后 SevenZipExtractor 根本不知道流来自的文件的扩展名。您现在可能已经弄清楚了,但我想我会澄清一下。
      【解决方案3】:

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

      例如:

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

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

      【讨论】:

      • 感谢 lnt,但我只想走简单的路,支持 7zip 支持的任何档案。
      • 好的,如果文件成功打开,则尝试使用sevenzipsharp打开文件,否则可能是存档。
      • 确实是我的第一次尝试,请查看 Nick 帖子的评论
      【解决方案4】:

      SharpCompress 也很容易做到这一点。

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 感谢 Farinha,我尝试过(请参阅 Nick 帖子中的评论),ta。
        【解决方案6】:

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

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

        【讨论】:

        • 谢谢马特,我要找的不仅仅是 zip - 它是 7zip 支持的任何存档。
        • 这让我们想到是否所有支持的格式都使用文件签名。如果是这样,没问题,如果不是,那就太可惜了 SevenZipSharp 似乎不是一个记录在案的 API。
        【解决方案7】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-17
          • 2012-07-06
          • 2012-12-03
          • 1970-01-01
          相关资源
          最近更新 更多