Страница: 1 |
Страница: 1 |
Вопрос: BinaryReader
Добавлено: 25.07.05 21:25
Автор вопроса: Borisfen | ICQ: 247914358
Помогите решить одну проблемку:
Я считываю файл в байтовый масиив при помощи BinaryReader:
Dim path As String = txtFilePath.Text
Dim br As BinaryReader
Dim FS As New FileStream(path, FileMode.Open, FileAccess.Read)
Dim lenth As Integer = FS.Length
br = New BinaryReader(FS)
Dim bytes() As Byte
bytes = br.ReadBytes(lenth)
И пытаюсь загрузить его в TextBox циклом в виде симоволов:
For i = 0 To bytes.GetUpperBound(0)
Text1.Text = Text1.Text & Chr(bytes(i))
If Not pb.Value = pb.Maximum Then pb.Value = pb.Value + 1
Next
Это работает, но ужасно тормозит!
А когда я напрямую добавляю в TextBox символы
Dim strBuilder as new System.Text.StringBuilder
For i = 0 To bytes.GetUpperBound(0)
strBuilder.Append(Ch(bytes(i))
If Not pb.Value = pb.Maximum Then pb.Value = pb.Value + 1
Next
Это работает знАААчително быстрее но в TextBox'e отображаются лишь несколько символов.
Что я делаю не так?
Ответы
Всего ответов: 7
Номер ответа: 1
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #1
Добавлено: 25.07.05 23:01
Бррр... А что здесь происходит?
Я вижу код, который считывает данные из файла в байтовый массив, а после этого вставляет его в TextBox.
Как в таком случае насчет этого?
Номер ответа: 2
Автор ответа:
Borisfen
ICQ: 247914358
Вопросов: 6
Ответов: 35
Профиль | | #2
Добавлено: 26.07.05 00:40
Боже мой! Какая проницательность!!!
Я что сказал что я пытаюсь считать текстовый файл?
А как быть с файлами которые больше чем 30 мегов?
Мне нужно отбражать состояние загрузки файла.
Номер ответа: 3
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #3
Добавлено: 26.07.05 01:16
Ну уж... Стараюсь...
Это очевидно из кода, приведенного тобой.
Во общем случае аналогично.
(для справки:
файл размером 26 МБ (конкретно 30 искать не скал) - 968 мс
58 мб - 2с
)
В твоем случае ты получаешь ... хм ... статистику помещения полученных данных в свойство Text класса TextBox.
(кстати, вариант с StringBuilder'ом в этом случае правилен - он даст тебе в разы бОльше быстродействие, чем String).
Сами же данные в буфер считываются за раз и информацию об этом процесе ты не получаешь.
Ты должен делать следующее.
Создать байтовый буфер размером, равным размеру считываемого файла.
Заполнять его определеными порциями, например, 1/100 от размера файла (при отображении процеса загрузки бОльший квант дискретности не потребуется).
Разумеется, для заведомо малых файлов (до 30-50 МБ) вообще ничего городить не надо - сразу считывай в результирующий буфер.
Далее алгоритм таков:
Получить размер файла
Создать байтовый буфер, размер которого равен размеру файла
Do While Not End
Считать порцию данных и поместить ее в буфер
Loop
Если необходимо, через System.Text.Encoding преобразуем байтовый массив в строку.
Номер ответа: 4
Автор ответа:
K&M
Вопросов: 5
Ответов: 28
Профиль | | #4
Добавлено: 26.07.05 14:47
дело в том, что в твоем первом варианте все правильно, а тормозит конкретно добавление в textBox - попробуй создать буферную строковую переменную и где то пару тысяч байтов считывать в нее потом добавлять ее содержимое к textBox, ее обнулять и снова в нее читать следующие быйты и так до конца - что то вроде этого - будет намного быстрее, скорость можно отрегулировать если изменять размер буфера.
Номер ответа: 5
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #5
Добавлено: 27.07.05 13:02
Она из главных ошибок тут - использование конкатенации строк.
В .NET строки устроены так, что, будучи единожды созданой, строка не
изменяется. Поэтому при добавлении к ней символа (или другой строки)
создается новая строка нужной длины и в нее копируется содержимое
исходных строк. На больших объемах данных этот код будет жутко
тормозить. Для предотвращения этого следует использовать
StringBuieder.
А также сомнительна сама идея читать из файла по байту. Если нужно
видеть прогресс чтения, стот читать блоками, скажем, по 1024 байта.
Это будет медленнее, чем читать файл одним куском, но заметно быстрее
побайтового чтения.
Номер ответа: 6
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #6
Добавлено: 27.07.05 13:26
Угу, даже сам винт считывает с диска как минимум сектор. Если бы он считал побайтово, то винда бы грузилась намного дольше (или была бы несравнимо меньше)
Номер ответа: 7
Автор ответа:
Borisfen
ICQ: 247914358
Вопросов: 6
Ответов: 35
Профиль | | #7
Добавлено: 28.07.05 22:01
Я нашел решение своей проблемы. Всем спасибо за ответы. Отдельное спаисбо Brand его ответ я учел.