2011-04-08 5 views
0

Мое приложение будет хранить большие объемы кэшированных данных в локальном хранилище для обеспечения производительности и отключений. Я попытался использовать SharpZipLib для сжатия созданных файлов кеша, но у меня есть некоторые трудности.Создание ZIP-файла программно

Я могу создать файл, но он недействителен. Windows-встроенная система zip и 7-zip обе указывают, что файл недействителен. Когда я пытаюсь открыть файл программно через SharpZipLib, я получаю исключение «Неверная подпись централизованного каталога». Я думаю, что часть проблемы в том, что я создаю zip-файл непосредственно из MemoryStream, поэтому нет «корневого» каталога. Не знаете, как создать программу с помощью SharpZipLib.

EntityManager ниже представляет собой «datacontext», созданный IdeaBlade DevForce. Он может сохранять свое содержимое в поток для сериализации на диск для кэширования.

Вот мой код:

private void SaveCacheFile(string FileName, EntityManager em) 
     { 
      using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication()) 
      { 
       using (IsolatedStorageFileStream isfs = new IsolatedStorageFileStream(FileName, System.IO.FileMode.CreateNew, isf)) 
       { 
        MemoryStream inStream = new MemoryStream(); 
        MemoryStream outStream = new MemoryStream(); 
        Crc32 crc = new Crc32(); 
        em.CacheStateManager.SaveCacheState(inStream, false, true); 
        inStream.Position = 0; 

        ZipOutputStream zipStream = new ZipOutputStream(outStream); 
        zipStream.IsStreamOwner = false; 
        zipStream.SetLevel(3); 

        ZipEntry newEntry = new ZipEntry(FileName); 
        byte[] buffer = new byte[inStream.Length]; 
        inStream.Read(buffer, 0, buffer.Length); 
        newEntry.DateTime = DateTime.Now; 
        newEntry.Size = inStream.Length; 
        crc.Reset(); 
        crc.Update(buffer); 
        newEntry.Crc = crc.Value; 
        zipStream.PutNextEntry(newEntry); 
        buffer = null; 

        outStream.Position = 0; 
        inStream.Position = 0;     
        StreamUtils.Copy(inStream, zipStream, new byte[4096]); 
        zipStream.CloseEntry(); 
        zipStream.Finish(); 
        zipStream.Close(); 
        outStream.Position = 0; 
        StreamUtils.Copy(outStream, isfs, new byte[4096]); 
        outStream.Close();  

       } 
      } 
     } 

ответ

0

Создание архива прямо из памяти не ваша проблема. SharpZipLib использует параметр в конструкторе ZipEntry для определения пути и не имеет значения, имеет ли этот путь подкаталоги или нет.

using (ZipOutputStream zipStreamOut = new ZipOutputStream(outputstream)) 
{ 
    zipStreamOut.PutNextEntry(new ZipEntry("arbitrary.ext")); 
    zipstreamOut.Write(mybytearraydata, 0, mybytearraydata.Length); 
    zipStreamOut.Finish(); 
    //Line below needed if outputstream is a MemoryStream and you are 
    //passing it to a function expecting a stream. 
    outputstream.Position = 0; 

    //DoStuff. Optional; Not necessary if e.g., outputstream is a FileStream. 
} 
-1

Удалить outStream.Position = 0; и он работает.

 Смежные вопросы

  • Нет связанных вопросов^_^