GZipStream не сжимается? - PullRequest
1 голос
/ 06 июня 2011

Я пытаюсь сжать поток памяти в другой поток памяти, чтобы я мог загрузить в остальные API.image - это исходный поток памяти, содержащий изображение tif.

WebRequest request = CreateWebRequest(...);
request.ContentType = "application/zip";
MemoryStream zip = new MemoryStream();
GZipStream zipper = new GZipStream(zip, CompressionMode.Compress);
image.CopyTo(zipper);
zipper.Flush();
request.ContentLength = zip.Length; // zip.Length is returning 0
Stream reqStream = request.GetRequestStream();
zip.CopyTo(reqStream);
request.GetResponse().Close();
zip.Close();

Насколько я понимаю, все, что я пишу в GZipStream, будет сжато и записано в любой поток, переданный в его конструктор.Когда я копирую поток изображений в молнию, кажется, что на самом деле ничего не копируется (размер изображения 200+ МБ).Это мой первый опыт работы с GZipStream, так что, скорее всего, я что-то упустил, любой совет относительно того, что было бы очень полезно.

РЕДАКТИРОВАТЬ: что-то, что я должен отметить, что было проблемой для меня, в приведенном выше коде,Позиция image была в самом конце потока ... Таким образом, когда я позвонил image.CopyTo(zipper);, из-за этой позиции ничего не было скопировано.

Ответы [ 3 ]

3 голосов
/ 06 июня 2011

[Отредактировано: чтобы удалить неверную информацию о GZipStream и его аргументах конструктора, и обновлено с помощью real ответа :)]

После того, как вы скопировали в молнию, вам нужносместить позицию MemoryStream обратно в ноль, так как процесс записи молнии в поток памяти увеличивает его «курсор», а также считываемый поток:

WebRequest request = CreateWebRequest(...);
request.ContentType = "application/zip";
MemoryStream zip = new MemoryStream();
GZipStream zipper = new GZipStream(zip, CompressionMode.Compress);
image.CopyTo(zipper);
zipper.Flush();
zip.Position = 0; // reset the zip position as this will have advanced when written to.
...

Еще одна вещь, на которую следует обратить внимание:GZipStream не доступен для поиска, поэтому вызов .Length вызовет исключение.

0 голосов
/ 06 июня 2011

Я ничего не знаю о C # и его библиотеках, но я бы попробовал сначала использовать Close вместо (или после) Flush.

(Java GZipOutputStream имеет ту же проблему, что он не очищается должным образом, до Java 7.)

0 голосов
/ 06 июня 2011

См. Этот пример: http://msdn.microsoft.com/en-us/library/system.io.compression.gzipstream.flush.aspx#Y300

Вы не должны вызывать flush в потоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...