Создание ZIP-файла программно - PullRequest
0 голосов
/ 08 апреля 2011

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

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

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

Вот мой код:

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();    

                }
            }
        }

Ответы [ 2 ]

0 голосов
/ 02 ноября 2011

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

0 голосов
/ 15 апреля 2011

Создание zip-файла прямо из памяти - это не ваша проблема.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.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...