![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| Hinidu |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 5.12.2009 Где: Калининград Репутация: нет Всего: нет |
Мне нужно взять архивный файл из изолированного хранилища и распаковать его по указанному пути. Но при распаковке относительно больших файлов(например маленькие txt распаковываются без проблем) теряется часть информации и файлы зачастую просто не открываются. При этом WinRAR распаковывает эти же файлы без проблем.
Запаковывался файл подобным образом. Помогите, пожалуйста, понять в чем проблема! Заранее очень благодарен. |
|||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
Hinidu, GZipStream и BinaryReader используют внутренние буфферы при работе с данными. Т.е. данные могут быть вычитаны из isolStream до соотв. вызова binReader.ReadBytes. Правильный признак что "байты закончились" - Position != Length на myBytes.Length > 0.
|
|||
|
||||
| Hinidu |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 5.12.2009 Где: Калининград Репутация: нет Всего: нет |
PashaPash, спасибо большое, теперь буду знать.
|
|||
|
||||
| Heinzz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 12.12.2008 Где: .net Репутация: 3 Всего: 9 |
а как бороться с этим? Такая проблема есть и у других потоков. |
|||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
Какая проблема? И зачем бороться с буфферизацией? |
|||
|
||||
| Heinzz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 12.12.2008 Где: .net Репутация: 3 Всего: 9 |
проблема такая у NetworkStream, если читать пока нечего он и не предупредит гад
борьба с использованием своего буфера |
|||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
Heinzz, по ссылке проблема вообще никак не связанная с внутренними буфферами. Никакими нулями NetworkStream ничего не заполняет.
Просто Stream.Read может прочитать меньше байт, чем у него попросили. Это явно сказано в документации, и это нормально поведение. А еще Stream.Read возвращает количество прочитаных байт. И еще, по той же ссылке - там достаточно было заменить BinaryReader.Read на BinaryReader.ReadBytes в ReadFromStream. |
|||
|
||||
| Heinzz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 12.12.2008 Где: .net Репутация: 3 Всего: 9 |
||||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
Read (Stream.Read и BinaryReader.Read) вычитывает все "пришедшие" на данный момент байты. Возвращает количество прочитанных. Если байт "не пришел" - оно его не вычитывает. ReadBytes читает count байт. Если "байт не пришел" - то ReadBytes тупо сидит и ждет пока байт придет. да нет там никаких нулей, никаких null, и никакого чтения непришедших байт. Представь что есть ведро с водой, в него капает тонкой струйкой. Это NetworkStream. Read - это зачерпнуть из него кружкой (буффером) "сколько накапало" - зачерпывает то что уже есть в ведре, но не больше кружки. ReadBytes - это зачерпнуть из ведра ровно полную кружку. Или меньше, если вдруг совсем перестанет капать - закроется сокет. Если в ведре недостаточно воды - подождать пока накапает. Это сообщение отредактировал(а) PashaPash - 15.12.2009, 20:44 |
|||
|
||||
| Heinzz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 12.12.2008 Где: .net Репутация: 3 Всего: 9 |
так нету в NetworkStream метода ReadBytes, только Read и ReadByte |
|||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
||||
|
||||
| Heinzz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 12.12.2008 Где: .net Репутация: 3 Всего: 9 |
спасибо, будем пробывать
|
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | .NET для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |