如何从 7z 中仅检索一个特定文件而不是解压缩并转储到文件夹中?

How do I retrieve only one specific file from a 7z instead of unzipping and dumping to a folder?

目前,我正在使用 7ZipCLI 将我的 .7z 文件夹解压缩到指定文件夹 destPath,如下所示:

private void ExtractFile(string archivePath, string destPath)
{
    string zpath = @"C:\Program Files-Zip\x64za.exe";
    try
    {
        ProcessStartInfo pro = new ProcessStartInfo();
        pro.WindowStyle = ProcessWindowStyle.Hidden;
        pro.FileName = zpath;
        pro.Arguments = string.Format("x \"{0}\" -y -o\"{1}\"", archivePath, destPath);
        Process x = Process.Start(pro);
        x.WaitForExit();
    }
    catch (System.Exception Ex)
    {
        Console.WriteLine("{0} Exception: ", Ex)
    }
} 

这需要很长时间,因为应用程序解压缩文件夹,将其卸载到 destPath,然后在 destPath 中搜索指定文件。我将如何查看 .7z,找到指定的文件并将该文件复制到 destPath?

如果你想用档案做一些有趣的事情,我建议你使用一个库而不是滚动你自己的流程执行解决方案。几乎每个任务都有 NuGet 包,这也不例外。

例如,SharpCompress 是一个相当常见的库,可以很好地处理大多数用途的 7z 档案解压。将其添加到您的项目并尝试这样的事情:

// Usings:
//  SharpCompress.Archives;
//  SharpCompress.Common;
//  System.Linq;

private static bool ExtractFile(string archivePath, string destPath, string fileSubstring)
{
    using (var archive = ArchiveFactory.Open(archivePath))
    {
        var entry = archive.Entries.FirstOrDefault(e => e.Key.Contains(fileSubstring));
        if (entry != null)
        {
            var opt = new ExtractionOptions
            {
                ExtractFullPath = false,
                Overwrite = true
            };
            try
            {
                entry.WriteToDirectory(destPath, opt);
                return true;
            }
            catch { }
        }
    }
    return false;
}

这是一个简单的例子。您可以传入过滤谓词并处理多个结果,只要符合您的要求即可。

运行 这里使用 SysInternals ProcMon 进行了一些测试以确认,这不会创建无关文件并且可以快速从大档案中提取小文件。

作为奖励,它不在乎你给它什么类型的存档,只要它是图书馆支持的。它将读取 RAR、ZIP、7z 和许多其他格式,如果需要,您可以使用相同的库对一些常见格式进行压缩。