Wie kann man wissen, welche rar zuerst in mehreren RAR-Archive mit SevenZipSharp / unrar in C # ist?

StackOverflow https://stackoverflow.com/questions/2317316

  •  22-09-2019
  •  | 
  •  

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());
            }
        }
War es hilfreich?

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());
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top