gpt4 book ai didi

C#.net识别zip文件

转载 作者:可可西里 更新时间:2023-11-01 03:13:49 26 4
gpt4 key购买 nike

我目前正在使用 SharpZip api 来处理我的 zip 文件条目。它非常适合压缩和解压缩。不过,我无法确定文件是否为 zip 文件。我需要知道是否有办法检测文件流是否可以解压缩。本来我用的

FileStream lFileStreamIn = File.OpenRead(mSourceFile);
lZipFile = new ZipFile(lFileStreamIn);
ZipInputStream lZipStreamTester = new ZipInputStream(lFileStreamIn, mBufferSize);// not working
lZipStreamTester.Read(lBuffer, 0, 0);
if (lZipStreamTester.CanDecompressEntry)
{

LZipStreamTester 每次都变为 null,if 语句失败。我在有/没有缓冲区的情况下尝试过。任何人都可以就为什么提供任何见解吗?我知道我可以检查文件扩展名。我需要比那更明确的东西。我也知道 zip 有一个神奇的#(PK something),但它不能保证它会一直存在,因为它不是格式的要求。

我还阅读了有关具有 native zip 支持的 .net 4.5 的信息,因此我的项目可能会迁移到它而不是 sharpzip,但我仍然需要在此处没有看到类似于 CanDecompressEntry 的方法/参数:http://msdn.microsoft.com/en-us/library/3z72378a%28v=vs.110%29

我最后的选择是使用 try catch 并尝试解压缩文件。

最佳答案

这是一个组件的基类,该组件需要处理未压缩、PKZIP 压缩 (sharpziplib) 或 GZip 压缩(内置于 .net 中)的数据。也许比你需要的多一点,但应该让你继续。这是使用@PhonicUK 的建议来解析数据流的 header 的示例。您在小工厂方法中看到的派生类处理 PKZip 和 GZip 解压缩的细节。

abstract class Expander
{
private const int ZIP_LEAD_BYTES = 0x04034b50;
private const ushort GZIP_LEAD_BYTES = 0x8b1f;

public abstract MemoryStream Expand(Stream stream);

internal static bool IsPkZipCompressedData(byte[] data)
{
Debug.Assert(data != null && data.Length >= 4);
// if the first 4 bytes of the array are the ZIP signature then it is compressed data
return (BitConverter.ToInt32(data, 0) == ZIP_LEAD_BYTES);
}

internal static bool IsGZipCompressedData(byte[] data)
{
Debug.Assert(data != null && data.Length >= 2);
// if the first 2 bytes of the array are theG ZIP signature then it is compressed data;
return (BitConverter.ToUInt16(data, 0) == GZIP_LEAD_BYTES);
}

public static bool IsCompressedData(byte[] data)
{
return IsPkZipCompressedData(data) || IsGZipCompressedData(data);
}

public static Expander GetExpander(Stream stream)
{
Debug.Assert(stream != null);
Debug.Assert(stream.CanSeek);
stream.Seek(0, 0);

try
{
byte[] bytes = new byte[4];

stream.Read(bytes, 0, 4);

if (IsGZipCompressedData(bytes))
return new GZipExpander();

if (IsPkZipCompressedData(bytes))
return new ZipExpander();

return new NullExpander();
}
finally
{
stream.Seek(0, 0); // set the stream back to the begining
}
}
}

关于C#.net识别zip文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11996299/

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