该网站主页上给出的示例代码无法编译。如何列出多部分 RAR 文件中的所有卷?
我有一个 Windows 10 文件夹,其中包含许多多部分 RAR 文件。“根”rar 及其部分需要隔离,然后移至各自的文件夹中。我可以通过创建一个文件夹并检查文件名来手动执行此操作,以便根 rar 和“part01.rar”、“part02.rar”等都位于同一目录中。
当有几十个多部分文件时,手动过程很乏味,所以我正在编写一个 C# 应用程序。到目前为止,我了解到这些多部分 RAR 文件的命名约定并不一致,这让我陷入了尴尬的境地:检查它们的文件名并通过字符串操作推断它们所属的位置。不酷。
所以我导入SharpCompress是为了科学、准确地获取文件名。其文档页面上有一个示例,它似乎完全符合我的要求。我已经围绕它包装了一个方法,现在将其作为“我尝试过的”呈现给您。
private static void GetFileNames(FileInfo rarFileInfo)
{
var archive = ArchiveFactory.Open(rarFileInfo.FullName);
foreach (var entry in archive.Entries)
{
if (!entry.IsDirectory)
{
Console.WriteLine(entry.FilePath);
}
}
}
Run Code Online (Sandbox Code Playgroud)
...并注意 VS 生成的红色文本...
它无法编译,因为无法解析“FilePath”!我是否使用了错误的框架?我在VS2013下使用.NET 4.5。从理论上讲,这里应该已经有很多问题,因为主站点上的文档示例无法编译,但实际上没有(我检查过)。
问题:如何使用 SharpCompress 来识别与给定 RAR 关联的所有卷,以便开发人员可以使用它们的名称。
注意:我还可以使用 WinRar API 将文件解压到它们自己的目录中,但这不是客户端想要的。 我稍后将实际解压它们,目的是将所有关联的卷放在各自的文件夹中。
我已经下载了 SharpCompress 源代码并创建了一个简单的控制台应用程序来解压缩一个小 .xz 文件。按照 github 网站上的几个不同示例以及 stackoverflow 上的其他示例,我找不到任何实际适用于“解压缩”.xz 文件的组合,也找不到任何说明或文档。有人真的能够使用 SharpCompress 来“解压缩”.xz 文件吗?
using (Stream stream = File.OpenRead(@"C:\temp\ot.xz"))
{
using (var reader = ReaderFactory.Open(stream))
{
while (reader.MoveToNextEntry())
{
if (!reader.Entry.IsDirectory)
{
Console.WriteLine(reader.Entry.Key);
reader.WriteEntryToDirectory(@"C:\temp", new ExtractionOptions()
{
ExtractFullPath = true,
Overwrite = true
});
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
此特定代码引发异常“无法确定压缩流类型”。支持的阅读器格式:Zip、GZip、BZip2、Tar、Rar、LZip、XZ'
以下代码效果更好(不会引发错误),但 Entry.Key 值是意外的或乱码。
using (Stream stream = File.OpenRead(@"C:\temp\ot.xz"))
{
var xzStream = new XZStream(stream);
using (var reader = TarReader.Open(xzStream))// ReaderFactory.Open(stream))
{
while (reader.MoveToNextEntry())
{
if (!reader.Entry.IsDirectory)
{
Console.WriteLine(reader.Entry.Key);
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个使用LZMA2压缩(压缩级别:超)的7zip存档。该档案文件包含1,749个文件,最初的总大小为661mb。压缩文件的大小为39mb。
现在,我正在尝试使用C#从此存档中提取一个很小的文件(大约200kb)。
我从IArchive(工作速度相对较快)中获取了相应的IArchiveEntry,但是随后调用IArchiveEntry.WriteToFile(targetPath)大约需要33秒!同样,如果我改为写入内存流,时间也很长。(编辑:当我在压缩级别=正常的7z LZMA2存档上运行此文件时,它仍需要9秒钟)
当我在实际的7zip应用程序中打开相同的存档并从那里提取相同的文件时,它只需要2-3秒。我怀疑这是多核(7zip)与单核(可能是ShapCompress吗?),但是我没有注意到7zip解压缩期间的CPU使用率激增。.也许它太快了,以至于无法注意到。
有人知道SharpCompress这么慢的速度可能是什么问题吗?我可能会缺少某些设置或使用了错误的工厂(ArchiveFactory)吗?
如果不是-是否有任何C#库在解压缩该库时可能会更快?
作为参考,这是我如何使用SharpCompress提取的草图:
private void Extract()
{
using(var archive = GetArchive())
{
var entryPath = /* ... path to entry .. */
var entry = TryGetEntry(archive, entryPath);
entry.WriteToFile(some_target_path);
}
}
private IArchive GetArchive()
{
string path = /* .. path to my .7z file */;
return ArchiveFactory.Open(path);
}
private IArchiveEntry TryGetEntry(IArchive archive, string path)
{
path = path.Replace("\\", "/");
foreach (var entry in archive.Entries)
{
if (!entry.IsDirectory)
{
if (entry.Key == path)
return entry;
} …Run Code Online (Sandbox Code Playgroud) 我需要使用SharpCompress将文件压缩为7zip:http://sharpcompress.codeplex.com
我做了如下:
using (var archive = ZipArchive.Create())
{
archive.AddEntry("CompressionTest.pdb", new FileInfo("CompressionTest.pdb"));
using (Stream newStream = File.Create("CompressionTest212.7z"))
{
archive.SaveTo(newStream, SharpCompress.Common.CompressionType.LZMA);
}
}
Run Code Online (Sandbox Code Playgroud)
压缩过程成功完成.但是,无法使用7z(http://www.7-zip.org/download.html)或winrar提取压缩文件.
我不知道是否有人也遇到了同样的问题,并且知道如何解决它?
提前致谢.