请教vbnet如何快速进行2进制大容量文件流读写操作?

qq_33929570 2018-08-29 10:41:54
新人,在学习用vbnet做文件的16进制数据编辑器,用fileopen和fileget,fileput来对超过10G的大文件从头开始寻指定的16进制数值的地址实在太慢太慢,想试用FileStream来处理,但不懂具体应该如何操作,所以上来请教。或者是否有更快速的方法呢?
下面是我用开的fileget方法,寻址实在太慢

Dim fn As Integer, ff As Integer
fn = FreeFile()
FileOpen(fn, "e:/1.pak", OpenMode.Binary)
Dim k As Long
For k = 0 To &6ABC4EAE1
FileGet(fn, ff, &H1 + k)
If ff = &H44B64119 Then
TextBox1.Text = Hex(&H1 + k)
End If
Next
FileClose(fn)
...全文
1026 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
良朋 2018-09-07
  • 打赏
  • 举报
回复
是你这句话太耗时间了!
TextBox1.Text = Hex(&H1 + k)
qq_33929570 2018-08-31
  • 打赏
  • 举报
回复
嗯整体速度慢是正常的,但我的意思是把搜索数值的速度提高。我试了用binaryreadr,搜索速度比用fileget快了至少超过10000倍(有点夸张),但是还有很多没有完善。能否有人帮忙看看如何完善一下?例如搜索不存在的数值会出错。下面是我的写法。

Dim fs As New FileStream("e:\1.txt", FileMode.Open, FileAccess.Read)
Dim br As New IO.BinaryReader(fs)
Dim k As Long, x As Long

Do
Do
Do
Do
x = x + 1
k = br.ReadByte
Loop Until k = &H19

x = x + 1
k = br.ReadByte
Loop Until k = &H41

x = x + 1
k = br.ReadByte
Loop Until k = &b6

x = x + 1
k = br.ReadByte
Loop Until k = &H44


TextBox1.Text = Hex(x - 4)


br.Close()
fs.Close()

qq_33929570 2018-08-31
  • 打赏
  • 举报
回复
以下方法可以支持非连续字节查找定位

Dim fs As New FileStream("e:\1.pak", FileMode.Open, FileAccess.ReadWrite)
Dim br As New IO.BinaryReader(fs)
Dim bw As New IO.BinaryWriter(fs)
Dim k As Byte, x As Long, g As Long, f As Long
Dim h As Long
f = fs.Length - 1

For g = 0 To f
If x < f Then

Do
x = x + 1

If x < f Then
k = br.ReadByte
Else
Exit Do
End If
Loop Until k = &H3C


h = x
If k = &H3C Then
Do While x - h <= 0
x = x + 1
If x < f Then
k = br.ReadByte
Else
Exit Do
End If
Loop
'If k = &H0 Then
'ListBox1.Items.Add(Hex(x - 1 ))
'End If
End If


h = x
If k = &H0 Then
Do While x - h <= 0
x = x + 1
If x < f Then
k = br.ReadByte
Else
Exit Do
End If
Loop
'If k = &H7f Then
'ListBox1.Items.Add(Hex(x - 1 - 1 ))
'End If
End If

h = x
If k = &H7F Then
Do While x - h <= 0
x = x + 1
If x < f Then
k = br.ReadByte
Else
Exit Do
End If
Loop
If k = &H97 Then
ListBox1.Items.Add(Hex(x - 1 - 1 - 1))
End If
End If

Else
Exit For
End If
Next

br.Close()
fs.Close()
liulilittle 2018-08-31
  • 打赏
  • 举报
回复
MemoryMappedFile / mmf 内存映射文件
qq_33929570 2018-08-31
  • 打赏
  • 举报
回复
自己调试很久,下面是本人觉得搜索大容量文件最效率的方法(10G文件从头到尾单字节开始搜索只用了53秒,用fileget直接死机)。不过还是略有不足。欢迎补充

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
ListBox1.Items.Clear()
Dim fs As New FileStream("e:\1.pak", FileMode.Open, FileAccess.Read)
Dim br As New IO.BinaryReader(fs)
Dim bw As New IO.BinaryWriter(fs)
Dim k As Byte, x As Long, g As Long, f As Long

f = fs.Length - 1

For g = 0 To f
If x < f Then
Do
Do
Do
Do
x = x + 1
If x < f Then
k = br.ReadByte
Else
Exit Do
End If
Loop Until k = &H19
x = x + 1
If x < f Then
k = br.ReadByte
Else
Exit Do
End If
Loop Until k = &H41
x = x + 1
If x < f Then
k = br.ReadByte
Else
Exit Do
End If
Loop Until k = &HB6
x = x + 1
If x < f Then
k = br.ReadByte
Else
Exit Do
End If
Loop Until k = &H44

TextBox1.Text = Hex(x)
ListBox1.Items.Add(Hex(x - 4))
TrackBar1.Value = (x / f) * 100
Else
Exit For
End If
Next

If ListBox1.Items.Count > 1 Then
ListBox1.Items.RemoveAt(ListBox1.Items.Count - 1)
End If

br.Close()
fs.Close()
End Sub
stherix 2018-08-30
  • 打赏
  • 举报
回复
用FileStream也救不了
在文件中搜索指定16进制,就要遍历整个文件,相当于把整个文件读一次
文件大了必然慢

16,722

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧