Comment savoir qui rar est d'abord en multi rar archives à l'aide de SevenZipSharp/Unrar en C#?
Question
Je suis en train d'utiliser SevenZipSharp ou/et Unrar bibliothèque en C#, WinForms .NET 3.5.J'ai ce problème avec plusieurs archives rar qui ont diffrent de nommage par exemple:
- .rar, r01, r02, r03, et ainsi de suite (c'est facile)
somefile01.rar, somefile02.rar, somefile03.rar
.001, .002, 003 et ainsi de suite.
Si je Unrar ou SevenZipSharp de mal d'archive, il va décompresser cette archive et laisser reposer déballé.J'ai donc à point de la droite (sauf si je fais quelque chose de mal).
Quelle serait la meilleure façon de vérifier pour qui?Pour l'instant je suis en vérifiant s'il y a plus d'un .rar fichiers dans le répertoire puis si donc je check pour 01.rar.Si il n'y a qu'un seul et .rar et quelques r01 puis-je obtenir .rar mais cela semble un peu mal.
Est-il un moyen de faire SevenZip ou Unrar à fait décompresser ensemble multi rar pack juste en pointant à tout .fichier rar?ou .001 ?
MadBoy
EDIT:
J'ai essayé d'utiliser le code suivant pour obtenir de l'information comme le suggère l'une réponse, mais il ne parvient pas à fournir de l'information promise.extr.ArchiveFileData retourne 0 pour zip, et 32 pour toute condition rar si c'est rar ou 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());
}
}
La solution
Je crois que vous pourriez utiliser SevenZipExtractor.ArchiveFileData
propriété, puis itérer sur les données d'en-tête de trouver l'information pertinente.
Une partie de la RAR structure d'en-tête :
HEAD_FLAGS de Bits indicateurs:2 octets
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 :
Quand j'ai téléchargé SevenZipSharp(il y a 1 heure) et a constaté que SevenZipExtractor
classe contient une propriété qui répertorie tous les fichiers dans le volume (VolumeFileNames
).Je pensais que la " Grande!C'était facile!', bien...il n'est jamais facile.Il semble que VolumeFileNames
fonctionne à merveille, mais seulement si vous le pointez sur la première rar en volume :(
Le wokraround :
J'ai créé une méthode de deviner et vérifier le premier volume :
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;
}
C'est rapide et sale, mais fonctionne et vous pouvez affiner davantage en fonction de vos besoins.
J'espère que cette aide.
Autres conseils
À l'aide de SharpCompress
using (var archive = RarArchive.Open("Rar.multi.part01.rar")))
{
Assert.IsTrue(archive.IsMultipartVolume());
Assert.IsTrue(archive.IsFirstVolume());
}