2012-04-06 2 views
2

Я пытаюсь обновить (добавить/изменить файлы) существующий JAR-файл, и этот код (используя библиотеку DotNetZip) приводит к тому, что архив «поврежден», я не могу открыть его с помощью WinRAR в качестве ZIP или JAR:Обновление файла JAR с помощью DotNetZip приводит к повреждению архива?

using (FileStream fs = new FileStream("/path/to/jar", FileMode.Open)) 
{ 
    ZipFile zip = ZipFile.Read(fs); 
    fs.Seek(0, SeekOrigin.Begin); 
    zip.Save(fs); 
} 

Может ли кто-нибудь сказать мне, в чем разница между форматом ZIP и JAR, точно? Я был под впечатлением, что это просто формат ZIP с манифестом в качестве первой записи в файле, что, по-видимому, не так. Есть ли существующая библиотека (C#), которую я могу использовать для этого?

ответ

1

A JAR is бинарный совместимый с ["стандартным"] ZIP архивом. Предусмотрен только файл Manifest, но это не приведет к «коррумпированному архиву».

Я считаю, что один (или оба) из них происходит:

  1. Не усечения файл так есть «мусор» остается в конце.
  2. Фактическое «Чтение» является ленивым, а последнее «Сохранить» может испортить данные, прежде чем они будут правильно прочитаны.

(Архивирование его в нового файла позволит это проверить.)

+1

Я не уверен, выпустить это, но вы были правы. Я решил проблему в своем производственном коде, сохраняя ZipFile в MemoryStream, закрывая и обнуляя поток файлов ZipFile, обнуляя ZipFile, а затем записывая MemoryStream в конечный пункт назначения. Вы спасли день, я думал, что все мои часы работы были потрачены впустую, спасибо огромное! – Salis