Не могу понять в чем дело. Есть файл 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);
Здравствуйте, Lloyd, Вы писали:
L>Очень маловероятно, что Close GZipStream-а не делает Flush.
Речь не о GZipStream, а о FileStream. Ему Close в первом варианте никто не вызывает.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
L>>Очень маловероятно, что Close GZipStream-а не делает Flush. S>Речь не о GZipStream, а о FileStream. Ему Close в первом варианте никто не вызывает.
А на кой фик ему нужен Flush? Ну останется кусок в буфере и что?
Здравствуйте, Lloyd, Вы писали:
L>Нет тут вопроса. В приведенном примере Flush для FileStream-а не нужен.
Это правда. Но она никак не связана с тем, что GZipStream вызывает Flush в Close. Который сам по себе тоже не нужен — в связи с using. Поэтому ключевое слово — "отдельный", а не "вопрос".
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
L>>Нет тут вопроса. В приведенном примере Flush для FileStream-а не нужен. S>Это правда. Но она никак не связана с тем, что GZipStream вызывает Flush в Close. Который сам по себе тоже не нужен — в связи с using. Поэтому ключевое слово — "отдельный", а не "вопрос".
Что-то я не понял смысла вашего первого комментария.
На основе чего вы решили, что adontz ведет речь именно о FileStream-е, а не о GZipStream?
Я еще могу понять логику, если он говорит о GZipStream-е: мало ли, не заметил using/Close и тогда встает вопрос о возможных буферах в GZipStream-е, которые не были сброшены в FileStream. Но предположение о том, что adontz ведет речь о вызове Flush у FileStream-а лично мне кажется соверешенно лишенным смысла.
Я чего-то упускаю?
Здравствуйте, Lloyd, Вы писали: L>Что-то я не понял смысла вашего первого комментария.
Ничего, я объясню. L>На основе чего вы решили, что adontz ведет речь именно о FileStream-е, а не о GZipStream?
С того, что он, в целом, разбирается в предмете. Обнаружив проблему (топикстартер забыл перемотать файлстрим в начало перед отдачей его в XmlReader), он посоветовал исправить её. Вызов Flush там действительно лишний, т.к. даже если что-то буферизовано, то XmlReader увидит ровно тот же буфер. Это было скорее продиктовано чрезмерной осторожностью.
L>Я еще могу понять логику, если он говорит о GZipStream-е: мало ли, не заметил using/Close и тогда встает вопрос о возможных буферах в GZipStream-е, которые не были сброшены в FileStream.
Эта логика не работает, т.к. GZipStream перематывать куда бы то ни было смысла нет — он всё равно будет вот-вот закрыт.
Но предположение о том, что adontz ведет речь о вызове Flush у FileStream-а лично мне кажется соверешенно лишенным смысла. L>Я чего-то упускаю?
Судя по всему — да. Давайте спросим у adontz, кому он предлагал вызывать Flush и Seek().
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
L>>Я еще могу понять логику, если он говорит о GZipStream-е: мало ли, не заметил using/Close и тогда встает вопрос о возможных буферах в GZipStream-е, которые не были сброшены в FileStream. S>Эта логика не работает, т.к. GZipStream перематывать куда бы то ни было смысла нет — он всё равно будет вот-вот закрыт.
Причем тут "перематывать"? Под вопросом-то Flush и про него я как-бы написал, в каких случаях это предположение-таки имеет смысл:
мало ли, не заметил using/Close и тогда встает вопрос о возможных буферах в GZipStream-е
S>Но предположение о том, что adontz ведет речь о вызове Flush у FileStream-а лично мне кажется соверешенно лишенным смысла.
Что-то вы меня еще больше запутали: вы же тремя постави выше ответили, что речь о FileStream, а теперь сами утверждаете, что в этом нет смысла.
Здравствуйте, Lloyd, Вы писали:
S>>Но предположение о том, что adontz ведет речь о вызове Flush у FileStream-а лично мне кажется соверешенно лишенным смысла. L>Что-то вы меня еще больше запутали: вы же тремя постави выше ответили, что речь о FileStream, а теперь сами утверждаете, что в этом нет смысла.
В этом есть смысл, Антон заблуждается Буфера на чтение и запись могут быть раздельными и не когерентными.
Здравствуйте, Lloyd, Вы писали:
L>Причем тут "перематывать"?
Перечитайте ответ Adontz. Внимательно. Там главное как раз Seek, то есть перемотка в начало. Или вы предположили, что Seek он предложил вызывать у FileStream, а Flush — уже у GZipStream?
S>>Но предположение о том, что adontz ведет речь о вызове Flush у FileStream-а лично мне кажется соверешенно лишенным смысла.
L>Что-то вы меня еще больше запутали: вы же тремя постави выше ответили, что речь о FileStream, а теперь сами утверждаете, что в этом нет смысла.
Прошу прощения, оговорка. Читать так:
Но предположение о том, что adontz ведет речь о вызове Flush у GZipStream-а лично мне кажется соверешенно лишенным смысла.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, 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-й цитате ("Я еще могу понять логику...").