Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: И ещё раз про загрузку файла! Добавлено: 17.07.03 16:06  

Автор вопроса:  balamut

Имеем следующее:

Dim b As Byte
Dim rez As String
Open "Filename" For Binary As #1
For i = 1 To LOF(1)
Get #1, , b
rez = rez & Hex(b)
Next i

вся загрузка длиться около 20 сукунд!!!!! хотя файл размером 37Кб!!!!!!!  Кто скажет в чём проблема?

Сенкс!

Ответить

  Ответы Всего ответов: 19  

Номер ответа: 1
Автор ответа:
 Chill



ICQ: 554200 

Вопросов: 101
Ответов: 343
 Профиль | | #1 Добавлено: 17.07.03 16:21

Ты считываешь по одному байту - это длительный роцесс. Если бы ты сразу считывал в строку, а потом бы над ней производил действия, было бы быстрее.

По-моему так, хотя я в вб с двоичным доступом давно не работал.

Ответить

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



Вопросов: 7
Ответов: 7
 Профиль | | #2 Добавлено: 17.07.03 16:25

не мог бы ты подправить, проседуру, для того чтобы считывать в строку, ато я чёто не соображу

Ответить

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



ICQ: 554200 

Вопросов: 101
Ответов: 343
 Профиль | | #3 Добавлено: 17.07.03 18:54

Dim b As String * 40

Open "c:\chill.txt" For Binary As #1

Get #1, , b

Me.Print b

Close #1

Ответить

Номер ответа: 4
Автор ответа:
 Алексей



black  admin

ICQ: 261779681 

Вопросов: 87
Ответов: 633
 Web-сайт: aleksey.nemiro.ru
 Профиль | | #4
Добавлено: 18.07.03 05:46

Строки это хорошо, вот только например chr(0) или chr(27) в них не увидишь.

 

Вот кусок из моей старой проги:

 

Public Sub LoadBinaryFile(ByVal lbfFileName As String)
  'on error resume next
   Dim i As Long
   Dim fs As Long
   Dim s As String
   Dim b As Byte
   Dim sb As String
   Dim memB As String
   Dim nfn As Integer
  
   prc = 0: pz = 0: nfn = 0
   sb = ""
   fs = FileLen(lbfFileName)
   
      Open lbfFileName For Binary Access Read As #1
   

     For i = 1 To fs
          Get #1, , b
          memB = Hex(b)
          If (Len(memB) = 1) Then memB = ("0" & memB)
          If (i > 1) Then memB = (" " & memB)

        s= s & memB
        Next i
      Close
text1.text = memb
End Sub

Ответить

Номер ответа: 5
Автор ответа:
 USA



Вопросов: 1
Ответов: 184
 Профиль | | #5 Добавлено: 18.07.03 08:03

To Nemiro AS:

Ты повторяешь то, от чего надо отойти: побайтовое чтение. Это самый главный тормоз в зтом деле. Дело в том, что устройства хранения информации выдают за одно обращение минимум один сектор. Размер сектора минимум 512 байт. А в строку прочитаются все символы.

To balamut:

Можно попробовать так:

1. Сформировать строку размером равным размеру файла.

2. Прочитать файл целиком в эту строку.

3. Передать строку в байтовый массив.

4. Читать из массива.

По п.1 пока идей никаких. Читать в строку файл при двоичном доступе легко. Передать строку в массив, причем очень быстро можно так: Arr = StrConv(Stroka, vbFromUnicode). Ну а работать с массивом в памяти работать будет быстро.

Это предположения, нужно поэксперементировать.

Ответить

Номер ответа: 6
Автор ответа:
 Алексей



black  admin

ICQ: 261779681 

Вопросов: 87
Ответов: 633
 Web-сайт: aleksey.nemiro.ru
 Профиль | | #6
Добавлено: 18.07.03 08:40

To USA:

Re: Ты повторяешь то, от чего надо отойти: побайтовое чтение.
Я многое поудалял :) Я считвал по байтам и одновременно записывал в другой файл hex-коды, а потом открывал созданный файл как текстовой через input. Все это безобразие по времени занимало 1 Мб = 5 сек - на Pentium 150 Mhz, а на Celeron 700 вобще все мгновенно происходит.

Re: 1. Сформировать строку размером равным размеру файла.
Но нестоит забывать про ограничения по количеству символов, всего 65535, т.е. 64 Кб

Re: Передать строку в массив, причем очень быстро можно так: Arr = StrConv(Stroka, vbFromUnicode).
И память не безгранична ;) Так и повиснуть не долго, если файл большой.

Ответить

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



Вопросов: 1
Ответов: 184
 Профиль | | #7 Добавлено: 18.07.03 09:07

Ограничение 64кб для TextBox. Строка - 2Гб.

А своп на что?

Ответить

Номер ответа: 8
Автор ответа:
 Алексей



black  admin

ICQ: 261779681 

Вопросов: 87
Ответов: 633
 Web-сайт: aleksey.nemiro.ru
 Профиль | | #8
Добавлено: 18.07.03 10:27

Re: Ограничение 64кб для TextBox

Да но только в Win 9x, в 2k и XP больше, мне удалось 120 запихать

Re: Строка - 2Гб.

Dim s as String*65536 'ошибка

---

Я там в чате читал, что ты с Дальнего Востока, откуда именно если не секрет

Ответить

Номер ответа: 9
Автор ответа:
 Алексей



black  admin

ICQ: 261779681 

Вопросов: 87
Ответов: 633
 Web-сайт: aleksey.nemiro.ru
 Профиль | | #9
Добавлено: 18.07.03 10:48
Извентиляюсь, string фиксированной длины 2^16, а переменной 2^31

Ответить

Номер ответа: 10
Автор ответа:
 balamut



Вопросов: 7
Ответов: 7
 Профиль | | #10 Добавлено: 18.07.03 20:44

To CHILL, спасибо,

твоя поправка помогла, читает быстро, но файлы больше чем 64Кб не читает, а если

задать Dim b As String т.е. переменной длины, то читает одну пустоту

В чём трабла

To NEMIRO AS, спасибо,

но в твоей проге какаято ошибка, VB зависает и "Not Responding"

Ответить

Номер ответа: 11
Автор ответа:
 Chill



ICQ: 554200 

Вопросов: 101
Ответов: 343
 Профиль | | #11 Добавлено: 18.07.03 23:08

Не знаю почему в строки фиксированной длины читает пустоту, но тут нашел в книге пример, как прочитать определенное колличество байт в строку:

'*******************************

strOutput$ = String(14," ")'по ходу для считывания в строку фиксированной длины

'сначала заполнить ее пробелами =)

Get #1, 26, strOutput$ 'считывает 14 байт в строку strOutput$, начиная с 26

'байта файла

'*******************************

Выводы: (скорее предположения =))

1)Можно использовать строки фиксированной длины, но их сначала надо проинициализировать " " (пробелом, или еще чем-нибудь);

2)Если считываешь из большого файла (>64Кб), то надо считывать начиная с определенного байта файла, например, считал первые 64Кб в строку, сохранил

где-нибудь (можно в RitchTextBox), потом считываешь в строку начиная с 64Кб файла, и т.д. =) (Этот механизм лучше использовать для строк фиксированной длины, где-то читал, что максимальная скорость считывания достигается при 512 байтовом буфере, в данном случае это по ходу фиксированная строка длинной 512 байт).

Надеюсь, я не очень все запутал и это все поможет решить твою задачу, в любом случае отпиши получилось или нет =)

Ответить

Номер ответа: 12
Автор ответа:
 balamut



Вопросов: 7
Ответов: 7
 Профиль | | #12 Добавлено: 19.07.03 12:16

Вобщем получилось вот так:

Open FileName For Binary As #1

FileSize = LOF(1)

Dim txt As String

txt = Space(650000)

Get #1, , txt

Close #1

Теперь читает файлы больше чем 64Кб.

Ща уменя новая проблема, я делаю что то вроде Hex-редактора и все данные из файла выводятся в TextBox. При выводе значений в TextBox, надо их разделять друг от друга. Спомощью vbTab - слишком далеко, а спомщью "пробел пробел" - в следующих строках начинается разнобой, т.е. столбцы получаются неровные. Что можно сделать?

Спасибо всем кто помогал!

Ответить

Номер ответа: 13
Автор ответа:
 Алексей



black  admin

ICQ: 261779681 

Вопросов: 87
Ответов: 633
 Web-сайт: aleksey.nemiro.ru
 Профиль | | #13
Добавлено: 19.07.03 12:35

И еще раз, мой старый код, много повырезал, но вроде работает:

 

fs=FileLen(lbfFileName)

 

Open lbfFileName For Binary Access Read As #1 'Файл для чтения

Open (App.Path & "\~000.tmp") For Binary Access Write As #2 'Временный файл, в него пишешь готовый HEX

 

For i = 1 To fs 'Начинаем читать по байтно с 1 до размера файла #1

Get #1, , b 'читаем i байт

memB = Hex(b) 'переводим байт в hex

If (Len(memB) = 1) Then memB = ("0" & memB) 'Если hex имеет один символ то добавляем еще "0" перед ним

If (i > 1) Then memB = (" " & memB) 'если первый байт, то будет без пробела, если больше 1 то с пробелами

Put #2, , memB 'Записывем во вроменный файл

Next i

Close 'Закрываем все файлы

 

Далее надо считать данные из временного файла, в TextBox(е) будет выглядеть примерно так:

00 00 00 00 00 00

00 00 00 00 00 00

Ответить

Номер ответа: 14
Автор ответа:
 Chill



ICQ: 554200 

Вопросов: 101
Ответов: 343
 Профиль | | #14 Добавлено: 19.07.03 14:44

Знаешь, что я подумал, большие файлы то он у тя открывать будет, а вот очень большие нет, я тут набросал прогу, которая 25 метровый файл очень быстро открывает, т.е. не весь файл, а частично определенное количество байт считыает, потом еще и т.д., если нада могу скинуть =)

А вот насчет выравнивания текста, да в Си можно было бы printf() использовать =)

Попробуй используй функцию Format()

http://vbnet.ru/vbguide/showfunction.asp?id=135

вроде должно помочь=)

Ответить

Номер ответа: 15
Автор ответа:
 Chill



ICQ: 554200 

Вопросов: 101
Ответов: 343
 Профиль | | #15 Добавлено: 19.07.03 14:56

strText = Format("1234", "@@@@@") & vbCrLf & Format("123", "@@@@@")

Вот пример использования функции, она выведет:

1234

123

Т.ч. я думаю твоя проблема решена =)

Ответить

Страница: 1 | 2 |

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



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