どのrarは最初にマルチrarアーカイブを利用SevenZipSharp/Unrarクライアントまで、フルのC#?
質問
私は利用しようとSevenZipSharpやUnrar図書館のC#できます。純3.5.私はこの問題の多rarアーカイブとして小ネーミング例えば:
- .rar,r01,r02,r03い(このは)
somefile01.rar,somefile02.rar,somefile03.rar
.001,.002,003います。
い点UnrarはSevenZipSharpに間違ったアーカイブので梱包を開ける、特定のアーカイブの休憩に開梱.いる点を除いいこと悪い)。
池尾:そういうふうに考えていチェックする方法を教えて下さい。For now i amチェックがします。rarファイル内のディレクトリにその場でチェック01.rar.が、一つだけます。rar-カップルのr01それを取得します。rarもう少し間違っています。
があるので、いくSevenZipはUnrar実際にアンパック全体のマルチrarパックだけを指す。rarファイルとは何ですか?や.001?
MadBoy
編集:
私は利用しようとした以下のコードを取得し情報示唆されている一つの答えが失敗した場合にお約束します。extr.ArchiveFileData0を返しますzip、32のために提供を一切rarかrarはr01.
using (SevenZipExtractor extr = new SevenZipExtractor(fileName)) {
foreach (var var in extr.ArchiveProperties) {
string attributes = var.Name;
object test = var.Value;
if (test == null) {
test = "THIS";
}
MessageBox.Show(attributes.ToString(), test.ToString());
}
foreach (var var in extr.ArchiveFileData) {
MessageBox.Show(var.Attributes.ToString());
}
}
解決
私はあなたが適切な情報を見つけるために、ヘッダデータを反復その後、SevenZipExtractor.ArchiveFileData
プロパティを使用し、できると信じています。
RARヘッダ構造のパート
HEAD_FLAGSビットフラグ:2バイト
0x0001 - Volume attribute (archive volume) 0x0002 - Archive comment present RAR 3.x uses the separate comment block and does not set this flag. 0x0004 - Archive lock attribute 0x0008 - Solid attribute (solid archive) 0x0010 - New volume naming scheme (\'volname.partN.rar\') 0x0020 - Authenticity information present RAR 3.x does not set this flag. 0x0040 - Recovery record present 0x0080 - Block headers are encrypted 0x0100 - First volume (set only by RAR 3.0 and later) other bits in HEAD_FLAGS are reserved for internal use
の編集の
私は(1時間前)SevenZipSharpをダウンロードした場合は、はそのSevenZipExtractor
クラスは、そのリストのボリューム(VolumeFileNames
)内のすべてのファイルプロパティが含まれています。私は「偉大なと思いました!それは簡単だった!」、よく...簡単なこと、それは決してません。 VolumeFileNames
が完全に動作することができますが、ボリューム内の最初のRARにそれを指している場合にのみようです:(
wokraroundます:
私は推測し、最初のボリュームを検証する方法を作成しました。
private static string LocateFirstVolume(string filename)
{
var isVolume = false;
var parts = 1u;
using (var extractor = new SevenZipExtractor(filename))
{
isVolume =
extractor.ArchiveProperties.Any(x =>
x.Name.Equals("IsVolume") && x.Value.Equals(true));
parts = (
from x in extractor.ArchiveProperties
where x.Name.Equals("Number of volumes")
select (uint)x.Value).DefaultIfEmpty(1u).SingleOrDefault();
}
if (!isVolume)
return null;
if (parts > 1)
return filename;
if (!Path.GetExtension(filename)
.Equals(".rar", StringComparison.OrdinalIgnoreCase))
{
var rarFile =
Path.Combine(
Path.GetDirectoryName(filename),
Path.GetFileNameWithoutExtension(filename) + ".rar");
if (File.Exists(rarFile))
{
var firstVolume = LocateFirstVolume(rarFile);
if (firstVolume != null)
{
return firstVolume;
}
}
}
var directoryFiles = Directory.GetFiles(Path.GetDirectoryName(filename));
foreach (var directoryFile in directoryFiles)
{
var firstVolume = LocateFirstVolume(directoryFile);
if (firstVolume != null)
{
using (var extractor = new SevenZipExtractor(firstVolume))
{
if (extractor.VolumeFileNames.Contains(filename))
{
return firstVolume;
}
}
}
}
return null;
}
これは、迅速&汚いですが、作品や、あなたのニーズに応じて、さらにそれを絞り込むことができます。
私はこのことができます願っています。
他のヒント
using (var archive = RarArchive.Open("Rar.multi.part01.rar")))
{
Assert.IsTrue(archive.IsMultipartVolume());
Assert.IsTrue(archive.IsFirstVolume());
}