使用 SharpCompress 识别与给定 RAR 存档关联的卷
Using SharpCompress to identify the volumes associated with a given RAR archive
TL;DR
站点主页上给出的示例代码无法编译。 如何列出多部分 RAR 文件中的所有卷?
问题定义
我有一个 Windows 10 文件夹,里面有很多多部分 RAR 文件。 'root' rar 及其部分需要分开,然后移动到它们自己的文件夹中。我可以通过创建一个文件夹并检查文件名来手动执行此操作,这样根 rar 然后 'part01.rar'、'part02.rar' 等都在同一个目录中。
当有几十个多部分文件时,手动过程很乏味,所以我正在编写一个 C# 应用程序。到目前为止,我了解到这些多部分 RAR 文件的命名约定并不一致,这让我在检查它们的文件名和 推断 它们所属的位置时感到尴尬通过字符串操作。不酷。
所以我正在导入 SharpCompress with a view towards getting the file names scientifically and precisely. There is an example on on its documentation page,它似乎完全符合我的要求。我围绕它包装了一个方法,现在将它作为“我尝试过的方法”呈现给您。
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);
}
}
}
...并注意 VS 生成的红色文本...
编译不通过,因为'FilePath'无法解析!我有错误的框架吗?我在 VS2013 下使用 .NET 4.5。 理论上这里应该已经有很多问题了,因为主页上的文档示例没有编译,但没有(我检查过)。
问题:如何使用 SharpCompress 识别与给定 RAR 关联的所有卷,以便开发人员可以使用它们的名称。
注意:我也可以使用 WinRar API 将文件解压到它们自己的目录中,但这不是客户想要的。 我稍后会解压它们,目的是将所有关联的卷一起放在它们自己的文件夹中。
修复示例
注意这是一条红鲱鱼
您的问题似乎是您的文档和库不匹配
SharpCompress 的 CodePlex 上的最新版本是 0.10.3,为此(当我下载它时),您的代码和示例代码工作正常。
但是,NuGet 和 GitHub 上存在的版本是 0.12.4
在这个版本中,似乎删除了 FullPath 的 IArchiveElement 成员。
此版本的文档可在 github 上找到,示例因此更改:
var archive = ArchiveFactory.Open(@"C:\Code\sharpcompress\TestArchives\sharpcompress.zip");
foreach (var entry in archive.Entries)
{
if (!entry.IsDirectory)
{
Console.WriteLine(entry.Key);
entry.WriteToDirectory(@"C:\temp", ExtractOptions.ExtractFullPath | ExtractOptions.Overwrite);
}
}
看起来 archive.Entries 现在是 IArchiveEntry 的字典(或类似的),路径用作字典的键,而不是用作IArchiveEntry 本身的成员。
所以简短的回答是您应该在上面的代码中将 Entry.FullPath
替换为 Entry.Key
。不过,我不清楚这如何帮助确定哪些档案需要合并在一起。
如何真正解决你的问题
您真正想要的是找到组成多部分 rar 的卷。
其中涉及使用“Rar”类的特定功能,而不是上面使用的基本接口。
这应该有效:
static void PrintVoulmes(string ArchivePath)
{
RarArchive openedArchive = RarArchive.Open(ArchivePath);
foreach (RarVolume vol in openedArchive.Volumes)
{
Console.WriteLine(vol.VolumeFile.FullName);
}
}
请注意,VolumeFile 是标准的 .net FileInfo 类型。
另请注意:这是用 0.10.3 版测试的,因为显然我无法获得 VS2012 的 0.12.4 版。 属性 名称也有可能在此处更改。
TL;DR
站点主页上给出的示例代码无法编译。 如何列出多部分 RAR 文件中的所有卷?
问题定义
我有一个 Windows 10 文件夹,里面有很多多部分 RAR 文件。 'root' rar 及其部分需要分开,然后移动到它们自己的文件夹中。我可以通过创建一个文件夹并检查文件名来手动执行此操作,这样根 rar 然后 'part01.rar'、'part02.rar' 等都在同一个目录中。
当有几十个多部分文件时,手动过程很乏味,所以我正在编写一个 C# 应用程序。到目前为止,我了解到这些多部分 RAR 文件的命名约定并不一致,这让我在检查它们的文件名和 推断 它们所属的位置时感到尴尬通过字符串操作。不酷。
所以我正在导入 SharpCompress with a view towards getting the file names scientifically and precisely. There is an example on on its documentation page,它似乎完全符合我的要求。我围绕它包装了一个方法,现在将它作为“我尝试过的方法”呈现给您。
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);
}
}
}
...并注意 VS 生成的红色文本...
编译不通过,因为'FilePath'无法解析!我有错误的框架吗?我在 VS2013 下使用 .NET 4.5。 理论上这里应该已经有很多问题了,因为主页上的文档示例没有编译,但没有(我检查过)。
问题:如何使用 SharpCompress 识别与给定 RAR 关联的所有卷,以便开发人员可以使用它们的名称。
注意:我也可以使用 WinRar API 将文件解压到它们自己的目录中,但这不是客户想要的。 我稍后会解压它们,目的是将所有关联的卷一起放在它们自己的文件夹中。
修复示例
注意这是一条红鲱鱼 您的问题似乎是您的文档和库不匹配
SharpCompress 的 CodePlex 上的最新版本是 0.10.3,为此(当我下载它时),您的代码和示例代码工作正常。
但是,NuGet 和 GitHub 上存在的版本是 0.12.4
在这个版本中,似乎删除了 FullPath 的 IArchiveElement 成员。
此版本的文档可在 github 上找到,示例因此更改:
var archive = ArchiveFactory.Open(@"C:\Code\sharpcompress\TestArchives\sharpcompress.zip");
foreach (var entry in archive.Entries)
{
if (!entry.IsDirectory)
{
Console.WriteLine(entry.Key);
entry.WriteToDirectory(@"C:\temp", ExtractOptions.ExtractFullPath | ExtractOptions.Overwrite);
}
}
看起来 archive.Entries 现在是 IArchiveEntry 的字典(或类似的),路径用作字典的键,而不是用作IArchiveEntry 本身的成员。
所以简短的回答是您应该在上面的代码中将 Entry.FullPath
替换为 Entry.Key
。不过,我不清楚这如何帮助确定哪些档案需要合并在一起。
如何真正解决你的问题
您真正想要的是找到组成多部分 rar 的卷。 其中涉及使用“Rar”类的特定功能,而不是上面使用的基本接口。 这应该有效:
static void PrintVoulmes(string ArchivePath)
{
RarArchive openedArchive = RarArchive.Open(ArchivePath);
foreach (RarVolume vol in openedArchive.Volumes)
{
Console.WriteLine(vol.VolumeFile.FullName);
}
}
请注意,VolumeFile 是标准的 .net FileInfo 类型。 另请注意:这是用 0.10.3 版测试的,因为显然我无法获得 VS2012 的 0.12.4 版。 属性 名称也有可能在此处更改。