如何从 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 和许多其他格式,如果需要,您可以使用相同的库对一些常见格式进行压缩。
目前,我正在使用 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 和许多其他格式,如果需要,您可以使用相同的库对一些常见格式进行压缩。