如何知道哪rar是第一个在多rar使用SevenZipSharp/管理C#?
题
我正尝试使用SevenZipSharp或/和管理图书馆在C#它.净3.5.我有这个问题与多rar档案,具有不同的命名例如:
- .rar,r01,r02r03等等(这是方便)
somefile01.rar,somefile02.rar,somefile03.rar
.001,在.002,003等。
如果我点管理或SevenZipSharp错误的归档,它将解,特别是存档和保留其余的解包。所以我有点合适的人(除非我做错了什么).
什么是最好的方式来检查?现在我检查,如果有更多的那一个。rar文件的内部目录,然后,如果所以我检查01.rar.如果只有一个。rar和几r01然后我得到的。rar但是,这似乎有点不对劲。
是否有办法使SevenZip或管理实际解整个多rar包刚刚通过指向任。rar的文件?或.001?
MadBoy
编辑:
我试图用以下代码,以获取信息的建议,在一个答案,但它未能交付承诺的信息。抽.ArchiveFileData返回0拉链,并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
编辑:
当我下载SevenZipSharp(1小时前),发现 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());
}