使用SharpCompress识别与给定RAR存档关联的卷

时间:2016-08-21 03:18:50

标签: c# .net sharpcompress

TL; DR

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

问题定义

我有一个包含大量多部分RAR文件的Windows 10文件夹。 'root'rar及其部分需要隔离,然后移动到自己的文件夹中。我可以通过创建文件夹并检查文件名来手动执行此操作,以便根rar然后'part01.rar','part02.rar'等都在同一目录中。

当有数十个多部分文件时,手动过程很繁琐,所以我正在编写一个C#应用程序。到目前为止我所学到的是,这些多部分RAR文件的命名约定并不一致,这使我在检查文件名和推断它们属于字符串操作的位置时出现了尴尬的行为。酷。

所以我导入SharpCompress以便科学而准确地获取文件名。它的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生成的红色文字......

enter image description here

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

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

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

1 个答案:

答案 0 :(得分:3)

修复示例

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

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版本。这也是物业名称在这里也有所改变的机会。