Wie kann man wissen, welche rar zuerst in mehreren RAR-Archive mit SevenZipSharp / unrar in C # ist?
Frage
Ich versuche SevenZipSharp oder / und unrar Bibliothek in C # WinForms .NET 3.5 zu verwenden. Ich habe dieses Problem mit Multi rar-Archiven, die diffrent Namensgebung zum Beispiel haben:
- .rar, r01, r02, r03 und so weiter (das ist leicht)
-
somefile01.rar, somefile02.rar, somefile03.rar
-
.001, .002, 003 und so weiter.
Wenn ich unrar oder SevenZipSharp falsche Archiv Punkt wird es entpacken, dass bestimmte Archiv und lassen Ruhe ausgepackt. Also muß ich die richtigen Punkt (es sei denn, ich etwas falsch tue).
Was wäre der beste Weg, um das zu überprüfen? Denn jetzt bin Überprüfung i, wenn es mehr als eine .rar-Dateien im Verzeichnis wird dann, wenn so i für 01.rar überprüfen. Wenn es nur ein und .rar und paar r01 ist dann bekomme ich .rar aber dies scheint ein wenig falsch.
Gibt es eine Möglichkeit SevenZip oder unrar tatsächlich auspacken ganzes Multi rar Pack zu machen nur von einer .rar Datei verweist? oder .001?
MadBoy
EDIT:
Ich habe versucht, folgenden Code zu verwenden, um Informationen zu erhalten, wie in einer Antwort vorgeschlagen, aber es nicht versprochen, Informationen zu liefern. extr.ArchiveFileData liefert 0 für zip, und 32 für alle zur Verfügung gestellt rar, ob es der rar oder 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());
}
}
Lösung
Ich glaube, dass Sie SevenZipExtractor.ArchiveFileData
Eigenschaft verwenden könnten und dann durch Iterierte Kopfdaten die relevanten Informationen zu finden.
Ein Teil der RAR-Header-Struktur :
HEAD_FLAGS Bitflags: 2 Byte
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
Edit:
Als ich (vor 1 Stunde) SevenZipSharp heruntergeladen und festgestellt, dass SevenZipExtractor
Klasse enthält eine Eigenschaft, dass listet jede Datei in Volumen (VolumeFileNames
). Ich dachte, ‚Great! Das war ganz einfach!‘, Na ja ... es ist nie so einfach. Es scheint, dass VolumeFileNames
perfekt funktioniert aber nur, wenn man es auf den ersten rar in Volumen Punkt: (
Die wokraround:
Ich habe ein Verfahren geschaffen, um die erste Band zu erraten und überprüfen:
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;
}
Es ist schnell und schmutzig, aber funktioniert und man kann es weiter verfeinern nach Ihren Bedürfnissen.
Ich hoffe, das hilft.
Andere Tipps
Mit SharpCompress
using (var archive = RarArchive.Open("Rar.multi.part01.rar")))
{
Assert.IsTrue(archive.IsMultipartVolume());
Assert.IsTrue(archive.IsFirstVolume());
}