问题
I am trying to use SevenZipSharp or/and Unrar library in C# WinForms .NET 3.5. I have this problem with multi rar archives that have diffrent naming for example:
- .rar, r01, r02, r03 and so on (this is easy)
- somefile01.rar, somefile02.rar, somefile03.rar 
- .001, .002, 003 and so on. 
If i point Unrar or SevenZipSharp to wrong archive it will unpack that particular archive and leave rest unpacked. So i have to point the right one (unless i am doing something wrong).
What would be the best way to check for that? For now i am checking if there are more then one .rar files inside directory then if so i check for 01.rar. If there's only one and .rar and couple of r01 then i get .rar but this seems a bit wrong.
Is there a way to make SevenZip or Unrar to actually unpack whole multi rar pack just by pointing to any .rar file? or .001 ?
MadBoy
EDIT:
I tried to use following code to get information as suggested in one answer but it fails to deliver promised information. extr.ArchiveFileData returns 0 for zip, and 32 for any provided rar whether it's rar or 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());
            }
        }
回答1:
I believe that you could use SevenZipExtractor.ArchiveFileData property and then iterate through header data to find the relevant information.
Part of the RAR header structure :
HEAD_FLAGS Bit flags: 2 bytes
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 :
When I downloaded SevenZipSharp(1 hour ago) and found that SevenZipExtractor class contains a property that lists every file in volume (VolumeFileNames). I thought 'Great! That was easy!', well... it's never that easy. It seems that VolumeFileNames works perfectly but only if you point it to the first rar in volume :(
The wokraround :
I've created a method to guess and verify the first 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;
}
It's quick&dirty but works and you can refine it further according to your needs.
I hope this helps.
回答2:
Using SharpCompress
using (var archive = RarArchive.Open("Rar.multi.part01.rar")))
{
    Assert.IsTrue(archive.IsMultipartVolume());
    Assert.IsTrue(archive.IsFirstVolume());
}
来源:https://stackoverflow.com/questions/2317316/how-to-know-which-rar-is-first-in-multi-rar-archives-using-sevenzipsharp-unrar-i