Непонятки с GZipStream
От: HeaveN Россия  
Дата: 21.09.11 14:52
Оценка:
Привет, All!

Не могу понять в чем дело. Есть файл xml, запакованный в gz.
Пытаюсь загрузить его в XmlDocument через FileStream.
Так не работает (отсутствует корневой элемент):

OpenFileDialog ofd = new OpenFileDialog();
ofd.ShowDialog();
Stream file = ofd.OpenFile();
FileStream decompressed = new FileStream(ofd.FileName + ".tmp", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read);

using (GZipStream gzs = new GZipStream(file, CompressionMode.Decompress))
{
  gzs.CopyTo(decompressed);
  gzs.Close();
}
XmlDocument doc = new XmlDocument();
doc.Load(decompressed);


А так работает:


OpenFileDialog ofd = new OpenFileDialog();
ofd.ShowDialog();
Stream file = ofd.OpenFile();
FileStream decompressed = new FileStream(ofd.FileName + ".tmp", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read);

using (GZipStream gzs = new GZipStream(file, CompressionMode.Decompress))
{
  gzs.CopyTo(decompressed);
  gzs.Close();
}

decompressed.Close();
decompressed.Dispose();
decompressed = new FileStream(ofd.FileName + ".tmp", FileMode.Open);
XmlDocument doc = new XmlDocument();
doc.Load(decompressed);



В чем может быть проблема первого варианта?
Нет такого закона, что человеку летать нельзя...
Re: Непонятки с GZipStream
От: Lloyd Россия  
Дата: 21.09.11 15:19
Оценка: 6 (1) +1
Здравствуйте, HeaveN, Вы писали:

HN>В чем может быть проблема первого варианта?


Проверьте Position у стрима, из которого грузите xml.
Re: Непонятки с GZipStream
От: adontz Грузия http://adontz.wordpress.com/
Дата: 21.09.11 15:23
Оценка: 4 (1)
Здравствуйте, HeaveN, Вы писали:

Вызвать Flush(); Seek(0, SeekOrigin.Begin);
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: Непонятки с GZipStream
От: Lloyd Россия  
Дата: 21.09.11 15:25
Оценка:
Здравствуйте, adontz, Вы писали:

A>Вызвать Flush(); Seek(0, SeekOrigin.Begin);


Очень маловероятно, что Close GZipStream-а не делает Flush.
Re[3]: Непонятки с GZipStream
От: adontz Грузия http://adontz.wordpress.com/
Дата: 21.09.11 15:30
Оценка:
Здравствуйте, Lloyd, Вы писали:

A>>Вызвать Flush(); Seek(0, SeekOrigin.Begin);

L>Очень маловероятно, что Close GZipStream-а не делает Flush.

Ну мне как-то лень рефлектором копаться
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[4]: Непонятки с GZipStream
От: Lloyd Россия  
Дата: 21.09.11 15:32
Оценка:
Здравствуйте, adontz, Вы писали:

L>>Очень маловероятно, что Close GZipStream-а не делает Flush.


A>Ну мне как-то лень рефлектором копаться


А здравый смысл тебе на что?
Re[5]: Непонятки с GZipStream
От: adontz Грузия http://adontz.wordpress.com/
Дата: 21.09.11 15:33
Оценка: +2 :)
Здравствуйте, Lloyd, Вы писали:

A>>Ну мне как-то лень рефлектором копаться

L>А здравый смысл тебе на что?

Здравый смысл подсказывает никому не доверять, везде индусы.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: Непонятки с GZipStream
От: HeaveN Россия  
Дата: 21.09.11 15:46
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Проверьте Position у стрима, из которого грузите xml.


Спасибо!
Нет такого закона, что человеку летать нельзя...
Re[3]: Непонятки с GZipStream
От: Sinclair Россия https://github.com/evilguest/
Дата: 22.09.11 03:37
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Очень маловероятно, что Close GZipStream-а не делает Flush.

Речь не о GZipStream, а о FileStream. Ему Close в первом варианте никто не вызывает.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: Непонятки с GZipStream
От: Lloyd Россия  
Дата: 22.09.11 07:31
Оценка:
Здравствуйте, Sinclair, Вы писали:

L>>Очень маловероятно, что Close GZipStream-а не делает Flush.

S>Речь не о GZipStream, а о FileStream. Ему Close в первом варианте никто не вызывает.

А на кой фик ему нужен Flush? Ну останется кусок в буфере и что?
Re[5]: Непонятки с GZipStream
От: Sinclair Россия https://github.com/evilguest/
Дата: 22.09.11 10:59
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>А на кой фик ему нужен Flush? Ну останется кусок в буфере и что?

А вот это уже совсем отдельный вопрос.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[6]: Непонятки с GZipStream
От: Lloyd Россия  
Дата: 22.09.11 11:15
Оценка:
Здравствуйте, Sinclair, Вы писали:

L>>А на кой фик ему нужен Flush? Ну останется кусок в буфере и что?

S>А вот это уже совсем отдельный вопрос.

Нет тут вопроса. В приведенном примере Flush для FileStream-а не нужен.
Re[7]: Непонятки с GZipStream
От: Sinclair Россия https://github.com/evilguest/
Дата: 23.09.11 06:47
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Нет тут вопроса. В приведенном примере Flush для FileStream-а не нужен.

Это правда. Но она никак не связана с тем, что GZipStream вызывает Flush в Close. Который сам по себе тоже не нужен — в связи с using. Поэтому ключевое слово — "отдельный", а не "вопрос".
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[8]: Непонятки с GZipStream
От: Lloyd Россия  
Дата: 23.09.11 07:33
Оценка:
Здравствуйте, Sinclair, Вы писали:

L>>Нет тут вопроса. В приведенном примере Flush для FileStream-а не нужен.

S>Это правда. Но она никак не связана с тем, что GZipStream вызывает Flush в Close. Который сам по себе тоже не нужен — в связи с using. Поэтому ключевое слово — "отдельный", а не "вопрос".

Что-то я не понял смысла вашего первого комментария.

На основе чего вы решили, что adontz ведет речь именно о FileStream-е, а не о GZipStream?
Я еще могу понять логику, если он говорит о GZipStream-е: мало ли, не заметил using/Close и тогда встает вопрос о возможных буферах в GZipStream-е, которые не были сброшены в FileStream. Но предположение о том, что adontz ведет речь о вызове Flush у FileStream-а лично мне кажется соверешенно лишенным смысла.
Я чего-то упускаю?
Re[9]: Непонятки с GZipStream
От: Sinclair Россия https://github.com/evilguest/
Дата: 25.09.11 09:11
Оценка:
Здравствуйте, Lloyd, Вы писали:
L>Что-то я не понял смысла вашего первого комментария.
Ничего, я объясню.
L>На основе чего вы решили, что adontz ведет речь именно о FileStream-е, а не о GZipStream?
С того, что он, в целом, разбирается в предмете. Обнаружив проблему (топикстартер забыл перемотать файлстрим в начало перед отдачей его в XmlReader), он посоветовал исправить её. Вызов Flush там действительно лишний, т.к. даже если что-то буферизовано, то XmlReader увидит ровно тот же буфер. Это было скорее продиктовано чрезмерной осторожностью.

L>Я еще могу понять логику, если он говорит о GZipStream-е: мало ли, не заметил using/Close и тогда встает вопрос о возможных буферах в GZipStream-е, которые не были сброшены в FileStream.

Эта логика не работает, т.к. GZipStream перематывать куда бы то ни было смысла нет — он всё равно будет вот-вот закрыт.
Но предположение о том, что adontz ведет речь о вызове Flush у FileStream-а лично мне кажется соверешенно лишенным смысла.
L>Я чего-то упускаю?
Судя по всему — да. Давайте спросим у adontz, кому он предлагал вызывать Flush и Seek().
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[10]: Непонятки с GZipStream
От: adontz Грузия http://adontz.wordpress.com/
Дата: 25.09.11 09:14
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Судя по всему — да. Давайте спросим у adontz, кому он предлагал вызывать Flush и Seek().


Я имел ввиду FileStream
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[10]: Непонятки с GZipStream
От: Lloyd Россия  
Дата: 25.09.11 15:01
Оценка:
Здравствуйте, Sinclair, Вы писали:

L>>Я еще могу понять логику, если он говорит о GZipStream-е: мало ли, не заметил using/Close и тогда встает вопрос о возможных буферах в GZipStream-е, которые не были сброшены в FileStream.

S>Эта логика не работает, т.к. GZipStream перематывать куда бы то ни было смысла нет — он всё равно будет вот-вот закрыт.

Причем тут "перематывать"? Под вопросом-то Flush и про него я как-бы написал, в каких случаях это предположение-таки имеет смысл:

мало ли, не заметил using/Close и тогда встает вопрос о возможных буферах в GZipStream-е



S>Но предположение о том, что adontz ведет речь о вызове Flush у FileStream-а лично мне кажется соверешенно лишенным смысла.


Что-то вы меня еще больше запутали: вы же тремя постави выше ответили, что речь о FileStream, а теперь сами утверждаете, что в этом нет смысла.
Re[11]: Непонятки с GZipStream
От: adontz Грузия http://adontz.wordpress.com/
Дата: 25.09.11 15:03
Оценка:
Здравствуйте, Lloyd, Вы писали:

S>>Но предположение о том, что adontz ведет речь о вызове Flush у FileStream-а лично мне кажется соверешенно лишенным смысла.

L>Что-то вы меня еще больше запутали: вы же тремя постави выше ответили, что речь о FileStream, а теперь сами утверждаете, что в этом нет смысла.

В этом есть смысл, Антон заблуждается Буфера на чтение и запись могут быть раздельными и не когерентными.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[11]: Непонятки с GZipStream
От: Sinclair Россия https://github.com/evilguest/
Дата: 25.09.11 16:15
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Причем тут "перематывать"?

Перечитайте ответ Adontz. Внимательно. Там главное как раз Seek, то есть перемотка в начало. Или вы предположили, что Seek он предложил вызывать у FileStream, а Flush — уже у GZipStream?

S>>Но предположение о том, что adontz ведет речь о вызове Flush у FileStream-а лично мне кажется соверешенно лишенным смысла.


L>Что-то вы меня еще больше запутали: вы же тремя постави выше ответили, что речь о FileStream, а теперь сами утверждаете, что в этом нет смысла.

Прошу прощения, оговорка. Читать так:
Но предположение о том, что adontz ведет речь о вызове Flush у GZipStream-а лично мне кажется соверешенно лишенным смысла.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[12]: Непонятки с GZipStream
От: Lloyd Россия  
Дата: 25.09.11 16:39
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, Lloyd, Вы писали:


L>>Причем тут "перематывать"?

S>Перечитайте ответ Adontz. Внимательно. Там главное как раз Seek, то есть перемотка в начало.

Внимательно следует перечитать вам. Причем пост, на который вы вызвались возражать.
Если вам это сложно, готов упростить вашу задачу:
Lloyd

Очень маловероятно, что Close GZipStream-а не делает Flush.


Sinclair

Речь не о GZipStream, а о FileStream. Ему Close в первом варианте никто не вызывает.


Как видишь, в моем посте нет никакого упоминания Seek. Раз я его не упомянул, то значит я не считаю, что с Seek-ом что-то не так.

S>Или вы предположили, что Seek он предложил вызывать у FileStream, а Flush — уже у GZipStream?


Для затравки 2 цитаты, на основе которых вы сможете сделать вывод, что именно я предположил:
1.

Проверьте Position у стрима, из которого грузите xml.

2.

Я еще могу понять логику, если он говорит о GZipStream-е: мало ли, не заметил using/Close и тогда встает вопрос о возможных буферах в GZipStream-е, которые не были сброшены в FileStream. Но предположение о том, что adontz ведет речь о вызове Flush у FileStream-а лично мне кажется соверешенно лишенным смысла.


Если сложности с пониманием не уйдут, готов оказать посильную помощь.

S>>>Но предположение о том, что adontz ведет речь о вызове Flush у FileStream-а лично мне кажется соверешенно лишенным смысла.


L>>Что-то вы меня еще больше запутали: вы же тремя постави выше ответили, что речь о FileStream, а теперь сами утверждаете, что в этом нет смысла.

S>Прошу прощения, оговорка. Читать так:
S>Но предположение о том, что adontz ведет речь о вызове Flush у GZipStream-а лично мне кажется соверешенно лишенным смысла.

В каких случаях это может иметь смысл, я озвучил во 2-й цитате ("Я еще могу понять логику...").
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.