.NET ZipPackage против DotNetZip при получении потоков к записям - PullRequest
0 голосов
/ 04 марта 2012

Я уже некоторое время использую класс ZipPackage в .NET, и мне очень нравится его простой и интуитивно понятный API. При чтении из записи я делаю entry.GetStream () и читаю из этого потока. При записи / обновлении записи я делаю entry.GetStream (FileAccess.ReadWrite) и записываю в этот поток. Очень простой и полезный, потому что я могу передать чтение / запись другому коду, не зная, откуда исходил поток.

Теперь, поскольку ZipPackage-API не содержит поддержки свойств записи, таких как LastModified и т. Д., Я изучал другие zip-api, например DotNetZip. Но я немного озадачен тем, как его использовать. Например, когда я хочу прочитать из записи, мне сначала нужно извлечь всю запись в MemoryStream, найти начало и передать этот поток другому моему коду. И чтобы записать запись, я должен ввести поток, из которого сама ZipEntry может читать. Это кажется очень отсталым для меня. Я неправильно использую этот API?

Разве ZipEntry не может доставить файл прямо с диска, на котором он хранится, и извлечь его по мере того, как читатель его читает? Это действительно нужно сначала полностью извлечь в память? Я не эксперт, но мне это кажется неправильным.

Ответы [ 2 ]

0 голосов
/ 06 марта 2012

при использовании библиотек DotNetZip не требуется считывать весь zip-файл в поток памяти. Когда вы создаете экземпляр экземпляра ZipFile, как показано ниже, библиотека читает только из заголовка zip-файла. Заголовки zip-файла содержат такие свойства, как последнее изменение и т. Д. Вот пример открытия zip-файла. Затем библиотека DotNetZip считывает заголовки zip-файлов и создает список всех записей в zip-файле:

с использованием (Ionic.Zip.ZipFile zipFile = Ionic.Zip.ZipFile.Read (this.FileAbsolutePath)) { ... }

Теперь вам нужно извлечь zip-файлы в поток, в файловую систему и т. Д. В приведенном ниже примере я использую метод доступа к строковым свойствам в zipFile, чтобы получить zip-файл с именем SomeFile.txt. Соответствующий объект ZipEntry затем извлекается в поток памяти.

MemoryStream memStr = new MemoryStream (); ZipFile [ "somefile.txt"] Extract (memStr). // Response.OutputStream);

Zip-записи должны быть прочитаны в пространстве процессов .NET, чтобы их можно было сдуть, нет способа обойти это, перейдя прямо в файловую систему. Аналогично тому, как будет работать ваш zip-экстрактор оболочки Windows Explorer - расширения оболочки Windows для 7zip или Windows, встроенные в сжатые папки, должны считывать записи в память, а затем записывать их в файловую систему, чтобы вы могли открыть запись.

0 голосов
/ 06 марта 2012

Хорошо, я отвечаю на это сам, потому что я нашел ответы.Очевидно, есть методы для обеих этих вещей, которые я хотел в DotNetZip.Для открытия потока чтения -> myZipEntry.OpenReader () и для открытия потока записи -> myZipFile.UpdateEntry (e, (fn, obj) => Serialize (obj)).Это отлично работает.

...