gpt4 book ai didi

c# - 如何在 C# 中使用 SevenZipSharp/Unrar 知道多 rar 文件中哪个 rar 是第一个?

转载 作者:行者123 更新时间:2023-11-30 16:34:49 30 4
gpt4 key购买 nike

我正在尝试在 C# WinForms .NET 3.5 中使用 SevenZipSharp 或/和 Unrar 库。我对具有不同命名的多 rar 文件有这个问题,例如:

  • .rar, r01, r02, r03 等(这很简单)
  • somefile01.rar, somefile02.rar, somefile03.rar

  • .001、.002、003 等等。

如果我将 Unrar 或 SevenZipSharp 指向错误的存档,它将解压该特定存档并解压其余部分。所以我必须指出正确的(除非我做错了什么)。

最好的检查方法是什么?现在我正在检查目录中是否有一个以上的 .rar 文件,如果是,我检查 01.rar。如果只有一个 .rar 和几个 r01,那么我得到 .rar 但这似乎有点不对。

有没有办法让 SevenZip 或 Unrar 仅通过指向任何 .rar 文件来实际解压整个 multi rar 包?或 .001 ?

疯子

编辑:

我尝试使用以下代码获取一个答案中建议的信息,但它未能提供 promise 的信息。 extr.ArchiveFileData 为 zip 返回 0,为任何提供的 rar 返回 32,无论它是 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 属性,然后遍历 header 数据以查找相关信息。

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

编辑:

当我下载 SevenZipSharp(1 小时前)并发现 SevenZipExtractor 类包含一个属性,该属性列出卷中的每个文件 (VolumeFileNames)。我想'太棒了!那很容易!',好吧......从来没有那么容易。似乎 VolumeFileNames 工作得很好,但前提是你将它指向卷中的第一个 rar :(

解决方法:

我创建了一种猜测和验证第一卷的方法:

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# - 如何在 C# 中使用 SevenZipSharp/Unrar 知道多 rar 文件中哪个 rar 是第一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2317316/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com