我有以下代码:
using (var zip = new ZipArchive(passStream))
{
Pass = Json.Deserialize<Pass>(Encoding.UTF8.GetString(Json.ReadFully(zip.GetEntry("pass.json").Open())));在zip.GetEntry行中,我得到了错误:
InvalidDataException:中心目录末尾预期的条目数与中央目录中的条目数不相对应。
我相当肯定这是因为正在处理的zip文件是一个SFX文件(我是用WinRar打开的,这就是它声明的格式)。文件是标准的Zip文件打开和处理刚刚好。此外-如果我双击SFX格式压缩文件直接在窗口,我得到一个错误状态‘压缩文件夹XXXXXXXXXXX是无效的’。如果我双击标准压缩文件,它们就会打开。
是否有一个内置的方式来处理C#中的SFX文件。我已经探索了System.IO.Compression的名字空间,没有看到任何东西。
如果.net / C#中没有任何内容,那么是否有一个nuget包可以完成这一任务。我已经看过其中的许多,没有发现任何具体声明他们处理SFX文件。如能提供任何协助,将不胜感激。
基于##UPDATED## @Shingo提供的信息,我做了以下工作:
var bs = new BufferedStream(fs);
int b;
bs.Position = 0;
while ((b = bs.ReadByte()) != -1)
{
if (b == 0x50)
{
var p = bs.Position;
if (bs.ReadByte() == 0x4b &&
bs.ReadByte() == 0x03 &&
bs.ReadByte() == 0x04)
{
//Copy from the current location (Positiong 6) to the new stream. This will remove the first 6 positions (index 0 -5)
var tobj_NewStream = new MemoryStream();
bs.CopyTo(tobj_NewStream);
bs.Close();
using (var zip = new ZipArchive(tobj_NewStream))
{
var ti_Entries = zip.Entries.Count();
}
break;
}
else
{
bs.Position = p + 1;
}
}
}在SFX字符之后,数组中的前几个条目是20、0、8、8、8、0。在创建了新的流之后,我验证了它是从索引0-5中的系列开始的,并且做到了。但是,当我将流加载到ZipArchive中时,仍然无法看到/访问其中的条目。我收到的错误消息与我一直收到的错误消息相同:
“中央目录”结尾项的System.IO.InvalidDataException HResult=0x80131501 Message=Number与“中央目录”中的条目数不相对应。Source=System.IO.Compression
还有其他建议吗?
发布于 2022-10-18 14:00:00
下面是一个简单的例子,您可以尝试一下。
var bs = new BufferedStream(filestream);
int b;
while((b = bs.ReadByte()) != -1)
{
if(b == 0x50)
{
var p = bs.Position;
if(bs.ReadByte() == 0x4b &&
bs.ReadByte() == 0x03 &&
bs.ReadByte() == 0x04)
{
var ms = new MemoryStream();
filestream.Position = p - 1;
filestream.CopyTo(ms);
using (var zip = new ZipArchive(ms))
{
//...
}
break;
}
else
{
bs.Position = p;
}
}
}https://stackoverflow.com/questions/74110179
复制相似问题