5

TL;DR

サイトのホームページにあるサンプル コードはコンパイルされません。マルチパート RAR ファイル内のすべてのボリュームを一覧表示する方法は?

問題定義

多数のマルチパート RAR ファイルを含む Windows 10 フォルダーがあります。「ルート」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.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 を取得できないようです。ここでもプロパティ名が変更されている可能性があります。

于 2016-08-22T14:21:13.300 に答える