我有一个 zip 文件,其中可能包含我想要的类型的文件,但我还不知道。当我在记事本中打开这些文件(解压缩时)时,前 8 个字符始终相同。有没有办法找出前 8 个字符是否匹配而无需解压缩整个(可能是几个 gb 的大小)文件?
这些文件通常超过 4gb,并且可能已经使用 deflate64 进行了压缩。这意味着我不能使用 SharpZipLib 或 DotNetZip - 我已经尝试过两者并且让它们在同一个文件上失败。
我一直在尝试以下列方式使用sevenzipsharp,但它只在每个文件的开头给了我零。e.Cancel 也没有取消,所以它最终将整个内容解压缩到 mstream 中,我想避免这种情况。
SevenZipExtractor extractor = new SevenZipExtractor(zipfilename);
foreach (ArchiveFileInfo info in extractor.ArchiveFileData)
{
bool isMyFileType = false;
MemoryStream mstream = new MemoryStream();
extractor.Extracting += (object sender, ProgressEventArgs e) =>
{
if (e.PercentDone * info.Size / 100 > 32)
{
// read the first 32 bytes
byte[] buffer = new byte[32];
if (mstream.Length >= 32)
mstream.Read(buffer, 0, 32);
else
mstream.Read(buffer, 0, (int)mstream.Length);
//bung the buffer into a streamreader
MemoryStream memstream = new MemoryStream(buffer);
StreamReader file = new StreamReader(memstream);
//read the stream
string filestart = "";
for (int i = 0; i < 8; i++)
{
if (!file.EndOfStream)
{
filestart = filestart + ((char)file.Read()).ToString();
}
}
isMyFileType = (filestart == "My8chars");
e.Cancel = true;
}
};
await CheckForMyFileType(info, mstream, extractor);
if (isMyFileType)
{
//do stuff if it's the right file type
private Task CheckForMyFileType(ArchiveFileInfo info, MemoryStream mstream, SevenZipExtractor extractor)
{
TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
extractor.ExtractFile(info.FileName, mstream);
tcs.SetResult(true);
return tcs.Task;
}