Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 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.

Как в таком случае насчет этого?

My.Computer.FileSystem.ReadAllText("c:\boot.ini", System.Text.Encoding.GetEncoding(1251))

Ответить

Номер ответа: 2
Автор ответа:
 Borisfen



ICQ: 247914358 

Вопросов: 6
Ответов: 35
 Профиль | | #2 Добавлено: 26.07.05 00:40
Как в таком случае насчет этого?

Боже мой! Какая проницательность!!!
Я что сказал что я пытаюсь считать текстовый файл?

А как быть с файлами которые больше чем 30 мегов?
Мне нужно отбражать состояние загрузки файла.

Ответить

Номер ответа: 3
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #3 Добавлено: 26.07.05 01:16
Боже мой! Какая проницательность!!!

Ну уж... Стараюсь...

Я что сказал что я пытаюсь считать текстовый файл?

Это очевидно из кода, приведенного тобой.

А как быть с файлами которые больше чем 30 мегов?

Во общем случае аналогично.
(для справки:
файл размером 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-сайт: www.vbnet.ru
 Профиль | | #5
Добавлено: 27.07.05 13:02
Она из главных ошибок тут - использование конкатенации строк.
В .NET строки устроены так, что, будучи единожды созданой, строка не
изменяется. Поэтому при добавлении к ней символа (или другой строки)
создается новая строка нужной длины и в нее копируется содержимое
исходных строк. На больших объемах данных этот код будет жутко
тормозить. Для предотвращения этого следует использовать
StringBuieder.

А также сомнительна сама идея читать из файла по байту. Если нужно
видеть прогресс чтения, стот читать блоками, скажем, по 1024 байта.
Это будет медленнее, чем читать файл одним куском, но заметно быстрее
побайтового чтения.

Ответить

Номер ответа: 6
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #6
Добавлено: 27.07.05 13:26
Угу, даже сам винт считывает с диска как минимум сектор. Если бы он считал побайтово, то винда бы грузилась намного дольше (или была бы несравнимо меньше) :)

Ответить

Номер ответа: 7
Автор ответа:
 Borisfen



ICQ: 247914358 

Вопросов: 6
Ответов: 35
 Профиль | | #7 Добавлено: 28.07.05 22:01
Я нашел решение своей проблемы. Всем спасибо за ответы. Отдельное спаисбо Brand его ответ я учел.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам