1

我在 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 的代码,它可以工作,但为什么?

4

0 回答 0