Ошибка «EOF In Header» с версией SharpZipLib 0.86.0.518 - PullRequest
1 голос
/ 27 января 2011

Я использую VS 2008 SP1 в Windows XP.

Я обновил ICSharpCode.SharpZipLib.dll с более старой версии 0.85.4.369 до новой версии 0.86.0.518.

Я успешно использую его для старых 0.85.4.369.

Я смог без проблем архивировать и распаковывать файлы и папки - ну, до сих пор.

Но теперь я получаю сообщение об ошибке «EOF In Header» при чтении ZIP-файла, созданного мной с использованием ICSharpCode.SharpZipLib.dll.

Мой код 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.

  • ZIP-файлы, созданные в предыдущих версиях DLL, прекрасно открываются новой 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, я думаю.

Есть идеи по этому поводу? какие-либо изменения в моем коде?

edit: Если удалить код о CRC, он работает, но почему ??

...