错误“头文件中的 EOF”版本为 SharpZipLib 0.86.0.518

发布于 2024-10-14 07:16:34 字数 4594 浏览 5 评论 0原文

我在 Windows XP 中使用 VS 2008 SP1。

我已将 ICSharpCode.SharpZipLib.dll 从旧版 0.85.4.369 更新为新版 0.86.0.518。

我已经在较旧的 0.85.4.369 版本中成功使用它。

我已经能够毫无问题地压缩和解压缩文件和文件夹 - 好吧,直到现在。

但现在,当读取我使用 ICSharpCode.SharpZipLib.dll 生成的 ZIP 文件时,我收到错误“EOF In Header”。

我的 C# 代码是相同的,没有任何变化。

失败:theEntry = z.GetNextEntry();

public static string LeerEtiquetaEmpaquetado(string zipFic)
{
    ZipInputStream z = null;
    DatosEmpaquetado datEmp;

    try
    {
        z = new ZipInputStream(File.OpenRead(zipFic));
        ZipEntry theEntry;

        do
        {
            theEntry = z.GetNextEntry();
            if (theEntry != null)
            {
                if (theEntry.Name.EndsWith("empaquetado.xml"))
                {
                    using (MemoryStream memWrt = new MemoryStream())
                    {
                        int size = 2048;
                        byte[] data = new byte[2048];
                        do
                        {
                            size = z.Read(data, 0, data.Length);
                            if ((size > 0))
                            {
                                memWrt.Write(data, 0, size);
                            }
                            else
                            {
                                break;
                            }
                        } while (true);

                        datEmp = LeerEmpaquetado(memWrt);
                        return datEmp.Etiqueta;
                    }
                    break;
                }
            }
            else
            {
                break;
            }
        } while (true);

        return null;
    }
    catch (Exception exc)
    {
        System.Diagnostics.Trace.WriteLine("Excepción: " + exc.Message);
        System.Diagnostics.Trace.WriteLine(exc.StackTrace);
        throw;
    }
    finally
    {
        if (z != null)
        {
            z.Close();
            z.Dispose();
        }
    }
}

ICSharpCode.SharpZipLib.dll ( 0.86.0.518 ) 似乎无法打开它刚刚创建的 ZIP。

非常奇怪的是:

  • 新创建的文件在 WinRAR 中打开得很好。

  • 使用以前版本的 DLL 创建的 ZIP 文件可以在新的 DLL 中正常打开。

ZIP 文件的代码:

public static void EmpaquetarProyecto(string dirOutput, string nombre, string dirDestino)
            {
                  string dirActual = Environment.CurrentDirectory;
                  Environment.CurrentDirectory = dirOutput;
                  string[] fileNames = Directory.GetFiles(".", "*.*", SearchOption.AllDirectories);
                  try
                  {
                        Crc32 objCrc32 = new Crc32();
                        ZipOutputStream strmZipOutputStream;
                        nombre = Path.Combine(dirDestino, nombre + ".zip");
                        strmZipOutputStream = new ZipOutputStream(File.Create(nombre));
                        strmZipOutputStream.SetLevel(6);

                        foreach (string aux in fileNames)
                        {
                             string strFile = aux;
                             if (strFile.StartsWith(".\\"))
                             {
                                   strFile = strFile.Substring(2);
                             }

                             FileStream strmFile = File.OpenRead(strFile);
                             byte[] abyBuffer = new byte[(Convert.ToInt32(strmFile.Length))];
                             strmFile.Read(abyBuffer, 0, abyBuffer.Length);
                             ZipEntry theEntry = new ZipEntry(strFile);
                             FileInfo fi = new FileInfo(strFile);
                             theEntry.DateTime = fi.LastWriteTime;
                             theEntry.Size = strmFile.Length;
                             strmFile.Close();
                             objCrc32.Reset();
                             objCrc32.Update(abyBuffer);
                             theEntry.Crc = objCrc32.Value;
                             strmZipOutputStream.PutNextEntry(theEntry);
                             strmZipOutputStream.Write(abyBuffer, 0, abyBuffer.Length);
                        }
                        strmZipOutputStream.Finish();
                        strmZipOutputStream.Close();
                  }
                  finally
                  {
                        Environment.CurrentDirectory = dirActual;
                  }
            }

我认为错误可能与 CRC 相关。

有什么想法吗?我的代码有什么变化吗?

编辑:如果删除有关 CRC 的代码,它可以工作,但为什么?

I use VS 2008 SP1 in Windows XP.

I have updated ICSharpCode.SharpZipLib.dll from older 0.85.4.369 to new 0.86.0.518.

I have been using it successfully for older 0.85.4.369.

I have been able to zip and unzip both files and folders without a problem - well, until now.

But now, I get error "EOF In Header" when read a ZIP file that I have generated using ICSharpCode.SharpZipLib.dll too.

My code C# is the same, no changes about it.

Fails: theEntry = z.GetNextEntry();

public static string LeerEtiquetaEmpaquetado(string zipFic)
{
    ZipInputStream z = null;
    DatosEmpaquetado datEmp;

    try
    {
        z = new ZipInputStream(File.OpenRead(zipFic));
        ZipEntry theEntry;

        do
        {
            theEntry = z.GetNextEntry();
            if (theEntry != null)
            {
                if (theEntry.Name.EndsWith("empaquetado.xml"))
                {
                    using (MemoryStream memWrt = new MemoryStream())
                    {
                        int size = 2048;
                        byte[] data = new byte[2048];
                        do
                        {
                            size = z.Read(data, 0, data.Length);
                            if ((size > 0))
                            {
                                memWrt.Write(data, 0, size);
                            }
                            else
                            {
                                break;
                            }
                        } while (true);

                        datEmp = LeerEmpaquetado(memWrt);
                        return datEmp.Etiqueta;
                    }
                    break;
                }
            }
            else
            {
                break;
            }
        } while (true);

        return null;
    }
    catch (Exception exc)
    {
        System.Diagnostics.Trace.WriteLine("Excepción: " + exc.Message);
        System.Diagnostics.Trace.WriteLine(exc.StackTrace);
        throw;
    }
    finally
    {
        if (z != null)
        {
            z.Close();
            z.Dispose();
        }
    }
}

The ICSharpCode.SharpZipLib.dll ( 0.86.0.518 ) seems unable to open the ZIPs it just created.

Very Strange thing is:

  • The newly-created files open just fine in WinRAR.

  • ZIP files created with previous versions of the DLL open just fine with the new DLL.

Code for ZIP file:

public static void EmpaquetarProyecto(string dirOutput, string nombre, string dirDestino)
            {
                  string dirActual = Environment.CurrentDirectory;
                  Environment.CurrentDirectory = dirOutput;
                  string[] fileNames = Directory.GetFiles(".", "*.*", SearchOption.AllDirectories);
                  try
                  {
                        Crc32 objCrc32 = new Crc32();
                        ZipOutputStream strmZipOutputStream;
                        nombre = Path.Combine(dirDestino, nombre + ".zip");
                        strmZipOutputStream = new ZipOutputStream(File.Create(nombre));
                        strmZipOutputStream.SetLevel(6);

                        foreach (string aux in fileNames)
                        {
                             string strFile = aux;
                             if (strFile.StartsWith(".\\"))
                             {
                                   strFile = strFile.Substring(2);
                             }

                             FileStream strmFile = File.OpenRead(strFile);
                             byte[] abyBuffer = new byte[(Convert.ToInt32(strmFile.Length))];
                             strmFile.Read(abyBuffer, 0, abyBuffer.Length);
                             ZipEntry theEntry = new ZipEntry(strFile);
                             FileInfo fi = new FileInfo(strFile);
                             theEntry.DateTime = fi.LastWriteTime;
                             theEntry.Size = strmFile.Length;
                             strmFile.Close();
                             objCrc32.Reset();
                             objCrc32.Update(abyBuffer);
                             theEntry.Crc = objCrc32.Value;
                             strmZipOutputStream.PutNextEntry(theEntry);
                             strmZipOutputStream.Write(abyBuffer, 0, abyBuffer.Length);
                        }
                        strmZipOutputStream.Finish();
                        strmZipOutputStream.Close();
                  }
                  finally
                  {
                        Environment.CurrentDirectory = dirActual;
                  }
            }

Perhaps error is aboutCRC, I think.

Any ideas about it? any changes in my code ?

edit: If delete code about CRC , it works, but why ??

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文