首页 > 解决方案 > WinZip 版本文件的 SharpZipLib 问题

问题描述

嗨,我正在尝试使用库 SharpZipLib v1.2.0 解压缩 zip 文件,但我无法使其工作。我尝试解压缩的文件是用 WinZip 9.0 制作的,并且有密码保护

我使用此代码尝试解压缩文件,但向我抛出异常消息:

ICSharpCode.SharpZipLib.Zip.ZipException:“库不支持提取此条目所需的 zip 版本”

    public static Dictionary<string, MemoryStream> ExtractZipContent(MemoryStream m, string password)
    {
        Dictionary<string, MemoryStream> files = new Dictionary<string, MemoryStream>();
        ZipFile file = null;
        try
        {
            file = new ZipFile(m);
            file.UseZip64 = UseZip64.On;
            if (!String.IsNullOrEmpty(password))
            {
                // AES encrypted entries are handled automatically
                file.Password = password;
            }

            foreach (ZipEntry zipEntry in file)
            {
                if (!zipEntry.IsFile)
                {
                    // Ignore directories
                    continue;
                }

                String entryFileName = zipEntry.Name;
                // to remove the folder from the entry:- entryFileName = Path.GetFileName(entryFileName);
                // Optionally match entrynames against a selection list here to skip as desired.
                // The unpacked length is available in the zipEntry.Size property.

                // 4K is optimum
                byte[] buffer = new byte[4096];
                Stream zipStream = file.GetInputStream(zipEntry);

                // Manipulate the output filename here as desired.
                //String fullZipToPath = Path.Combine(OutputFolder, entryFileName);
                //string directoryName = Path.GetDirectoryName(fullZipToPath);

                //if (directoryName.Length > 0)
                //{
                //    Directory.CreateDirectory(directoryName);
                //}

                // Unzip file in buffered chunks. This is just as fast as unpacking to a buffer the full size
                // of the file, but does not waste memory.
                // The "using" will close the stream even if an exception occurs.
                //using (FileStream streamWriter = File.Create(fullZipToPath))
                //{

                MemoryStream s = new MemoryStream();
                StreamUtils.Copy(zipStream, s, buffer);
                files.Add(entryFileName, s);
            }
        }
        finally
        {
            if (file != null)
            {
                file.IsStreamOwner = true; // Makes close also shut the underlying stream
                file.Close(); // Ensure we release resources
            }
        }
        return files;
    }

即使我尝试使用其他代码但没有结果但现在给我一个不同的错误

ICSharpCode.SharpZipLib.Zip.ZipException:'无效密码'

但密码正确我可以使用 7Zip 或 WinZip10 解压缩文件

 public static Dictionary<string, MemoryStream> UnZip(MemoryStream stream, string password)
    {
        Dictionary<string, MemoryStream> files = new Dictionary<string, MemoryStream>();
        using (ZipInputStream zip = new ZipInputStream(stream))
        {
            zip.Password = password;
            //file.UseZip64 = UseZip64.On;

            //file.CommitUpdate();
            ZipEntry zipEntry;
            if ((zipEntry = zip.GetNextEntry()) != null)
            {
                string directoryName = Path.GetDirectoryName(zipEntry.Name);
                string fileName = Path.GetFileName(zipEntry.Name);
                Console.WriteLine($"zipEntry directoryName={directoryName} fileName={fileName}");
                // create directory
                if (directoryName.Length > 0)
                {
                    Directory.CreateDirectory(directoryName);
                }
                if (fileName != String.Empty)
                {
                    MemoryStream streamWriter = new MemoryStream();
                    int size = 2048;
                    byte[] buffer = new byte[2048];
                    while (true)
                    {
                        size = zip.Read(buffer, 0, buffer.Length);
                        if (size > 0)
                        {
                            streamWriter.Write(buffer, 0, size);
                        }
                        else
                        {
                            break;
                        }
                    }
                    files.Add(fileName, streamWriter);
                }
            }
        }
        return files;
    }

zip 文件是由第三方创建的,所以我无法更改版本或创建方式

标签: c#unzipsharpziplib

解决方案


推荐阅读