5

TL;博士

该站点主页上给出的示例代码无法编译。如何列出多部分 RAR 文件中的所有卷?

问题定义

我有一个包含许多多部分 RAR 文件的 Windows 10 文件夹。'root' 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);
        }
    }
}

...并注意 VS 生成的红色文本...

在此处输入图像描述

它无法编译,因为 'FilePath' 无法解析!我有错误的框架吗?我在 VS2013 下使用 .NET 4.5。理论上,这里应该已经有很多问题了,因为主页上的文档示例没有编译,但没有(我检查过)。

问题:如何使用 SharpCompress 识别与给定 RAR 关联的所有卷,以便开发人员可以使用它们的名称。


注意:我也可以使用 WinRar API 将文件解压到它们自己的目录中,但这不是客户想要的。 稍后我将实际解压缩它们,目的是将所有关联的卷放在它们自己的文件夹中。

4

1 回答 1

4

修复示例

请注意,这是一条红鲱鱼 您的问题似乎是您的文档和库不匹配

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.FullPathEntry.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 版本。此处的属性名称也有可能已更改。

于 2016-08-22T14:21:13.300 回答