| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > .NET для новичков > Проблема при распаковке файла GZipом |
| Автор: Hinidu 12.12.2009, 13:59 | ||
Мне нужно взять архивный файл из изолированного хранилища и распаковать его по указанному пути. Но при распаковке относительно больших файлов(например маленькие txt распаковываются без проблем) теряется часть информации и файлы зачастую просто не открываются. При этом WinRAR распаковывает эти же файлы без проблем.
Запаковывался файл подобным образом. Помогите, пожалуйста, понять в чем проблема! Заранее очень благодарен. |
| Автор: PashaPash 12.12.2009, 23:12 |
| Hinidu, GZipStream и BinaryReader используют внутренние буфферы при работе с данными. Т.е. данные могут быть вычитаны из isolStream до соотв. вызова binReader.ReadBytes. Правильный признак что "байты закончились" - Position != Length на myBytes.Length > 0. |
| Автор: Hinidu 13.12.2009, 18:47 |
| PashaPash, спасибо большое, теперь буду знать. |
| Автор: Heinzz 13.12.2009, 19:05 | ||
а как бороться с этим? Такая проблема есть и у других потоков. |
| Автор: PashaPash 14.12.2009, 01:26 |
Какая проблема? И зачем бороться с буфферизацией? |
| Автор: Heinzz 14.12.2009, 21:39 |
| проблема такая у NetworkStream, если читать пока нечего он и не предупредит гад http://social.msdn.microsoft.com/Forums/en-US/netfxnetcom/thread/31057b8c-3300-4b71-9e87-9f17ec0be06a |
| Автор: PashaPash 15.12.2009, 00:03 |
| Heinzz, по ссылке проблема вообще никак не связанная с внутренними буфферами. Никакими нулями NetworkStream ничего не заполняет. Просто Stream.Read может прочитать меньше байт, чем у него попросили. Это явно сказано в документации, и это нормально поведение. А еще Stream.Read возвращает количество прочитаных байт. И еще, по той же ссылке - там достаточно было заменить BinaryReader.Read на BinaryReader.ReadBytes в ReadFromStream. |
| Автор: PashaPash 15.12.2009, 20:43 | ||
Read (Stream.Read и BinaryReader.Read) вычитывает все "пришедшие" на данный момент байты. Возвращает количество прочитанных. Если байт "не пришел" - оно его не вычитывает. ReadBytes читает count байт. Если "байт не пришел" - то ReadBytes тупо сидит и ждет пока байт придет. да нет там никаких нулей, никаких null, и никакого чтения непришедших байт. Представь что есть ведро с водой, в него капает тонкой струйкой. Это NetworkStream. Read - это зачерпнуть из него кружкой (буффером) "сколько накапало" - зачерпывает то что уже есть в ведре, но не больше кружки. ReadBytes - это зачерпнуть из ведра ровно полную кружку. Или меньше, если вдруг совсем перестанет капать - закроется сокет. Если в ведре недостаточно воды - подождать пока накапает. |
| Автор: Heinzz 15.12.2009, 22:28 | ||
так нету в NetworkStream метода ReadBytes, только Read и ReadByte |
| Автор: PashaPash 16.12.2009, 00:11 | ||
так есть BinaryReader, с конструктром BinaryReader(Stream). и есть BinaryReader.ReadBytes. Товарищ по ссылке юзает BinaryReader, но вызывает BinaryReader.Read, получая странные результаты. |
| Автор: Heinzz 17.12.2009, 11:16 |
| спасибо, будем пробывать |