VB二进制快速读写类

用VB6读写数据库中的图片 1,以人名和相关图片为例说明,数据库为Access,有如下字段:Name char,picture OLE object,FileLength Number。当为ms sql时,将picture改为lob即可。 2,示例包含control:commom dialog,picture,listbox。 源码如下: Option Explicit Private Declare Function Ge 阅读详情

利用自建的文件缓冲区来提高文件读写速度,下面是与VB 自带的Put Get 进行比较

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
测试代码 :Form1
Option Explicit

Private cfb1 As CFileBuff
Private cfb2 As CFileBuff
Private fh1 As Long
Private fh2 As Long

Private Sub Command1_Click()
   Dim fn1 As String
   Dim fn2 As String
   Dim fn3 As String
   Dim ch As Byte
   Dim i As Long
   Dim st1 As Single, et1 As Single
   Dim st2 As Single, et2 As Single
  
   fn1 = App.Path & "/D.DAT"
   fn2 = App.Path & "/D.BAK"
   fn3 = App.Path & "/D.BAK2"
  
   st1 = Timer
   Set cfb1 = New CFileBuff
   Set cfb2 = New CFileBuff
  
   If cfb1.Create(fn1) = True Then
      cfb2.Create (fn2)
      Do
      
        If cfb1.GetByte(ch) = 1 Then
          
          cfb2.PutByte ch
        Else
          Exit Do
        End If
      Loop While cfb1.FEof = False
     
   Else
      Debug.Print "Error Open File!"
   End If
   Set cfb1 = Nothing
   Set cfb2 = Nothing
   et1 = Timer
  ' MsgBox CStr(et1 - st1)
  
   st2 = Timer
   fh1 = FreeFile(0)
   Open fn1 For Binary As fh1
  
   fh2 = FreeFile(0)
   Open fn3 For Binary As fh2
   Do
       Get fh1, , ch
       Put fh2, , ch
   Loop While EOF(fh1) = False
   Close fh1
   Close fh2
   et2 = Timer
   MsgBox CStr(et1 - st1) & " " & CStr(et2 - st2)
   Debug.Print "Success!"
End Sub

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
类代码 : CFileBuff
Option Explicit

'文件缓冲类,利用块读写来提高文件的读写速度

Private Const GENERIC_WRITE = &H40000000
Private Const GENERIC_READ = &H80000000
Const FILE_ATTRIBUTE_NORMAL = &H80
Const CREATE_ALWAYS = 2
Const OPEN_ALWAYS = 4
Const INVALID_HANDLE_VALUE = -1
Const ERROR_HANDLE_EOF = 38

Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, _
        lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, _
        lpNumberOfBytesRead As Long, ByVal lpOverlapped As Long) _
        As Long

Private Declare Function CloseHandle Lib "kernel32" ( _
        ByVal hObject As Long) As Long

Private Declare Function WriteFile Lib "kernel32" ( _
        ByVal hFile As Long, lpBuffer As Any, _
        ByVal nNumberOfBytesToWrite As Long, _
        lpNumberOfBytesWritten As Long, ByVal lpOverlapped As _
        Long) As Long

Private Declare Function CreateFile Lib "kernel32" _
        Alias "CreateFileA" (ByVal lpFileName As String, _
        ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, _
        ByVal lpSecurityAttributes As Long, _
        ByVal dwCreationDisposition As Long, _
        ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile _
        As Long) As Long

Private Declare Function SetFilePointer Lib "kernel32" ( _
        ByVal hFile As Long, ByVal loWord As Long, ByVal hiWord As Long, ByVal MoveMethod As Long) As Long

Public Enum enumFileSeek
   FS_BEGIN
   FS_CURRENT
   FS_END
End Enum


Private Const MAX_FILE_BUFF As Long = 512 '定义最大的缓冲区,正好一个扇区
Private Const EOF_CHAR As Byte = 0

Private m_fb(MAX_FILE_BUFF - 1) As Byte
Private m_NeedCloseFile As Boolean '是否需要

Private m_Handle As Long
Private m_OffSet As Long
Private m_DirtyFlag As Boolean
Private m_LastBuff As Boolean
Private m_MaxBytes As Long
Private m_FileName As String
'按标志创建文件
Public Function Create(FileName As String) As Boolean
    m_Handle = CreateFile(FileName, GENERIC_WRITE Or GENERIC_READ, 0, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0)
    If m_Handle <> INVALID_HANDLE_VALUE Then  '看是否正确创建了文件
       m_FileName = FileName
       ReadFileToBuff
       Create = True
    Else
       Create = False
    End If
End Function
'关闭文件
Public Sub CloseFile()
    WriteBuffToFile
    CloseHandle m_Handle
End Sub
'移动文件指针,不支持超过2 ^ 31 的位移
Public Function FSeek(Pos As Long, FS As enumFileSeek) As Boolean
    Dim iPos As Long
   
    If m_DirtyFlag = True Then WriteBuffToFile
    Select Case FS
       Case FS_BEGIN
         
          If Pos < 0 Then FSeek = False
         
          If SetFilePointer(m_Handle, Pos, 0, 0) = &HFFFFFFFF Then
            FSeek = False
          Else
            If ReadFileToBuff = -1 Then
              FSeek = False
            Else
              FSeek = True
            End If
          End If
         
       Case FS_END
          If Pos > 0 Then FSeek = False
         
          If SetFilePointer(m_Handle, Pos, 0, 2) = &HFFFFFFFF Then
            FSeek = False
          Else
            If ReadFileToBuff = -1 Then
              FSeek = False
            Else
              FSeek = True
            End If
          End If
      
       Case FS_CURRENT
          iPos = Pos - (m_MaxBytes - m_OffSet) '计算实际的偏移位置
         
          If SetFilePointer(m_Handle, iPos, 0, 1) = &HFFFFFFFF Then
            FSeek = False
          Else
            If ReadFileToBuff = -1 Then
              FSeek = False
            Else
              FSeek = True
            End If
          End If
           
    End Select
End Function
'取一个字节
'返回 1 表示正确取到字符
'返回 0 表示已到文件尾,并且ch= EOF_CHAR
'返回 -1 表示取字符错误。
Public Function GetByte(ByRef ch As Byte) As Long
   Dim fl As Long
   If m_LastBuff = False Then
        If m_OffSet = MAX_FILE_BUFF Then
            fl = ReadFileToBuff
            Select Case fl
              Case 0
                GetByte = 0
              Case -1
                GetByte = -1
              Case Else
                ch = m_fb(0)
                m_OffSet = 1
                GetByte = 1
            End Select
        Else
            ch = m_fb(m_OffSet)
            m_OffSet = m_OffSet + 1
            GetByte = 1
        End If
   Else
        If m_OffSet < m_MaxBytes Then
            ch = m_fb(m_OffSet)
            m_OffSet = m_OffSet + 1
            GetByte = 1
        Else
            ch = EOF_CHAR
            GetByte = 0
        End If
   End If
 
End Function
'写一个字节,如果正确表示1,错误为-1
Public Function PutByte(by As Byte) As Long
    If m_OffSet < MAX_FILE_BUFF Then
      
       m_fb(m_OffSet) = by
       m_OffSet = m_OffSet + 1
       m_DirtyFlag = True
   
    Else  '已写满一个缓冲区
      
       WriteBuffToFile
       m_fb(0) = by
       m_OffSet = 1
       m_DirtyFlag = True
      
    End If
End Function
'看当前指针是否到达文件最尾端
Public Function FEof() As Boolean
   If m_LastBuff = False Then
      FEof = False
   Else
      If m_OffSet = m_MaxBytes Then
         FEof = True
      Else
         FEof = False
      End If
   End If
End Function
'///////////////////////////////////////////////////////////////////////////////////////
'预读字节到缓冲区,并返回实际读到的字节,如果返回-1,则表示出错了。
Private Function ReadFileToBuff() As Long
    Dim dwReadNum As Long
   
    If ReadFile(m_Handle, m_fb(0), MAX_FILE_BUFF, dwReadNum, 0) = 0 Then
        ReadFileToBuff = -1
    Else
        If dwReadNum <> MAX_FILE_BUFF Then
           '最后一个缓冲区
          
           m_LastBuff = True
           m_MaxBytes = dwReadNum
           m_OffSet = 0
           m_DirtyFlag = False
          
           ReadFileToBuff = dwReadNum
          
        Else
          
           m_LastBuff = False
           m_MaxBytes = MAX_FILE_BUFF
           m_OffSet = 0
           m_DirtyFlag = False
          
           ReadFileToBuff = MAX_FILE_BUFF
        End If
       
    End If
End Function
'写缓冲区到文件,并返回实际写的字节数
Private Function WriteBuffToFile() As Long
    Dim dwWriteNum As Long
   
    If m_OffSet = 0 Or m_DirtyFlag = False Then '如果写入数为0或者写入标志错则不写入
        WriteBuffToFile = 0
    Else
        If WriteFile(m_Handle, m_fb(0), m_OffSet, dwWriteNum, 0) Then
           WriteBuffToFile = dwWriteNum
        Else
           WriteBuffToFile = -1 '出错
        End If
    End If
   
    m_OffSet = 0
    m_DirtyFlag = False
  
End Function

Private Sub Class_Initialize()
    Dim i As Long
  
    m_OffSet = 0
    m_Handle = 0
    m_DirtyFlag = False
    m_FileName = ""
    m_LastBuff = False
    m_MaxBytes = MAX_FILE_BUFF
  
End Sub

Private Sub Class_Terminate()
    CloseFile
End Sub

【VB6|第25期】VB6文件操作:读取与写入二进制数据 今天,我们将探讨上期教程《【VB6|第24期】VB6玩转Base64数据:编码与解码指南》留下来问题,在 VB6 中,如何读取文件为二进制数据,以及如何将二进制数据转换为文件。本文将带你一步步完成这两个过程。 阅读详情

相关推荐

掌握VB2005:二进制文件读写操作指南

本文还有配套的精品资源,点击获取 简介:在VB2005编程环境中,二进制文件的读写是处理图像、音频和自定义数据结构等非文本数据的重要技能。本案例深入探索了如何使用 FileStream 类和 BinaryReader / BinaryWriter 类来高效地进行二进制文件的读取与写入操作,包括文件流的创建、数据的读写、定位与缓冲管理...

weixin_36483050的博客 1200

vb常用文件读写操作

1、顺序文件的读写操作(Input, LineInput,Print,Write)Open Filepath For (For Mode) As #FilenumberFor Mode有三种:Input是读文件,要求指定的文件必须已打开。Output是写文件,如果找不到文件,则系统建一个文件并写入数据,覆盖原内容。Append是写文件,不过会在原文件末尾写入数据。如果找不到文件,则系统建一个文件并

hztlgac的专栏 2242

二进制文件比较技术与VB实现方法

在IT行业和软件开发领域,文件比较是一项基础而重要的任务。尤其是在软件发布、更新、版本控制、代码审查以及数据备份和恢复等方面。进行文件比较有多种方法,但二进制文件比较在精确性、执行速度和数据一致性方面表现尤为突出。二进制文件比较技术主要关注于文件内容的位级分析,这在对比两个文件是否完全相同以及确定它们之间存在的差异时非常有效。由于二进制文件直接以0和1的形式存储,因此这种方法能够检测出即使是微小的变化,如一个字节的差异。

weixin_42466857的博客 1040

怎样用vb读/写二进制文件

Open 语句能够对文件输入/输出 (I/O)。语法Open pathname For mode [Access access] [lock] As [#]filenumber [Len=reclength]Open 语句的语法具有以下几个部分:部分描述         pathname 必要。字符串表达式,指定文件名,该文件名可能还包括目录、文件夹及驱动器。         mode 必要。

我的专栏 4745

VB6.0实现对2007 ACCESS数据库的读写操作

简介:本篇内容着重于在VB6.0环境下读取和写入Microsoft Access 2007数据库的技巧。VB6.0作为一种较老的编程工具,可能与新版本的Access数据库存在兼容性问题。文章将介绍解决格式差异、ADO版本兼容性、连接字符串、错误处理以及SQL语法调整等关键问题的方法,并提供示例代码或教程,帮助开发者克服这些兼容性难题。

weixin_32005771的博客 1270

VB实现顺序文件写操作实践教程

顺序文件是一种文件组织方式,其中的数据记录是连续存储的,每条记录通常具有相同的长度或者有明确的分隔符。这种文件类型在处理文本和二进制数据时非常常见。顺序文件便于读取,因为可以按顺序扫描整个文件,从而快速访问文件的任意部分。

weixin_35578748的博客 759

vb6关于VB以二进制(binary)方式读取文本内容

http://hi.baidu.com/xa87/blog/item/5fc9df0abe10e91d94ca6b3a.html Dim Data() As Byte '原结果,字节型 Dim i As Long '循环变量 Dim a As String '转换后的结果 D

roy9494的专栏 8398

VB文本行数统计技术细节

本文还有配套的精品资源,点击获取 简介:在Visual Basic编程中,统计文本行数是一个基础而重要的任务。这通常涉及到文件操作,如打开、读取、关闭文件,以及使用特定的函数逐行读取内容。为了完成这项任务,需要了解如何使用 Open 和 Close 函数进行文件操作, Input# 函数逐行读取文本,使用计数器变量 line...

weixin_35982453的博客 1437

VB.NET 读写HTML 文件,VB.NET 简单介绍文件的读写----流类

我们知道在计算机内部处理的数据信息以及存放在在磁盘上的文件,对于计算机而言就是一堆二进制数(字节)。这些字节(甚至是位,但计算机通常按字节对它们进行分组)。只有在程序解析了这些字节时,它们才具有了对用户更有价值的高级含义。使用高级程序设计语言处理数据的过程,有时候把数据看作字节能使用更多的方法处理该数据。Visual Studio使用流的概念,把在计算机内部(或者网络中)传输的数据看作像河里流淌的...

weixin_30471013的博客 1118

VB实现周期均值法数据分析程序

Visual Basic(VB)作为一种编程语言,最初由微软公司开发于1991年。它是基于BASIC语言的一种面向对象的编程语言,最初目的是为了简化Windows应用程序的开发。VB的发展经历了多个版本,从最初的VB1.0到今天的VB.NET,它一直都在不断地进化和改善。VB以其简单易学和快速开发的特点,成为了很多初学者接触编程的首选语言。VB在数据处理和分析方面虽然不像Python或R语言那样主流,但在特定的Microsoft生态系统和一些企业级应用中,VB依然保持着其重要地位。

weixin_42601608的博客 861

vb读取文件内容并以二进制显示

vb读取文件内容并以二进制显示,适合初学者学习。

※部分VB文章汇总B※

★第七部分 ★ ★VB小技巧:字符变量中双引号的输入  ★VB将自定义资源中的文件释放出来  ★VB在菜单上增加图标  ★Visual Basic 十年风云  ★VB表格控件总览与例程分析  ★利用VB函数Dir()实现递归搜索目  ★Visual Basic里与Print有关的函数  ★VB输入文本文件实现右对齐  ★VB查找替代字符串的函数  ★vb 换行...

miaozk2006的专栏 416

用VB 获取二进制

汉字显示,可以用单片机实现汉字在LED上的有效显示,可用于广告、车站、码头等场合。

VB从程序中生成Exe文件

从程序中生成Exe文件  这篇文章要讨论的是在一个VB程序中如何产生出另一个Exe文件。  要实现这个目的,必须符合以下几个条件:    第一、编写这样的程序时,具备欲生成的Exe文件    第二、事先知道欲生成的Exe文件大小  其实这两个条件可以说不是条件,但确实很重要。  为了叙说方便,将发行的程序称作APP-1.Exe,要生成的文件叫APP-2.Exe,以下是具体步骤:    第一步,准备...

miaozk2006的专栏 1254

手把手教你搭建硬件在回路(HIL)仿真系统:从Simulink建模到实时测试

本文详细介绍了如何从零开始搭建硬件在回路(HIL)仿真系统,涵盖Simulink建模、实时仿真、代码生成及调试等关键步骤。通过具体配置示例和优化技巧,帮助开发者解决复杂控制系统验证中的技术难题,提升半实物仿真的效率和可靠性。

weixin_30952535的博客 445

TOEIC托业词汇汇总(完整版)

1.appointment 约会,约定2.attendance 出席人数;出席3.cabinet 橱柜4.calendar 日历;月历;行事历5.clerk 办事员,书记6.directory 人名住址薄7.duplicte 复制;副本8.filing 归档9.in-tray 待处理文件盒10.monitor 检测;监视;追踪11.out-tray 已处理文件盒12.partition 分隔;分隔物(如墙壁等)13.postage 邮费。

weixin_39676449的博客 1万+

vb/vb.net开发精粹(23)

编VB程序结合有道网页翻译找生词的尝试 请教字符串数据提取思路 请教字符串数据提取思路 自定义控件内模块怎么调用子控件? VB模块化“识别数据库路径” 为什么我的程序里kill t总是删除不了呢? VB执行SQL语句耗时太久导致程序假死怎么办? 请教高手指点迷津,如何读取一定格式的文本文件向Excel写入数据? 如何让程序跳过启动时的一个对话框 VC代码转VB 如何更新col

师以长技以制夷 1393

Vben Admin权限管理全解析:从动态菜单到按钮级控制(附代码示例)

本文全面解析Vben Admin框架的权限管理系统,从动态菜单生成到按钮级细粒度控制,提供完整的实现方案和代码示例。深入探讨基于角色-权限模型的架构设计,分享前后端协作的最佳实践,帮助开发者快速构建安全高效的企业级后台系统。

weixin_30919429的博客 486

VB 提取TextBox 文本框中指定一行字符串

这是使用EM_GETLINE message来做,比较奇特的是lParam是指向一个字串所在的位置,但是该字串传入时,前两个Byte要存该字串允许的最大长度。'以下在Form需一个TextBox,并设定MultiLine = True, 一个Command Button     Private Sub Command1_Click()        Dim str5 As String   ...

miaozk2006的专栏 3268

别再死记硬背了!一张图搞懂无刷电机半桥与全桥驱动的核心差异(附避坑指南)

本文深入解析无刷直流电机的半桥与全桥驱动方式的核心差异,提供直观对比与选型指南。半桥驱动结构简单、成本低,适合低要求场景;全桥驱动性能优越但复杂,适用于高精度控制。文章还包含实战避坑指南,帮助工程师优化驱动方案选择与应用。

weixin_29290947的博客 320

CQE和SQE 以及 PQA和DQA的区别

‌:PQA聚焦产品全生命周期流程管理,DQA专注于设计阶段的质量控制。

a1809032425的博客 1907

VB 实例:掌握 Visual Basic 编程的精髓

Visual Basic(简称VB)是一种由微软开发的高级编程语言,它结合了易于使用的界面和强大的编程功能,使得初学者和专业人士都能快速开发Windows桌面应用程序。本文将通过一系列实例,深入探讨VB编程的基础知识和高级技巧,帮助读者掌握这门语言的精髓。

wjs2024的博客 514

HyperLynx(十八)DDR(一)DDR简介和DDR的数据仿真

LVTTL电平为单端信号,而SSTL电平本质上是差分对,其实现机制是将信号与参考电平Vref组成差分对进行比较,如图所示,VIH和VIL各有一个交流参数AC和直流参数DC,信号第一次越过AC门限的时刻,作为时序计算的参考点,此后只要信号保持DC门限内,逻辑状态保持不变,这种设计减小了噪声、振铃等对于信号质量的影响。经过调整后,控制器在发送颗粒1的DQS后,延时1ns再发送颗粒2的DQS,则颗粒1在1ns后收到对齐的DQS和CLK,颗粒2在2ns后收到对齐的DQS和CLK,从而满足了时序关系。

小幽余生不加糖 7679
上一篇: More Faster , More VB User
下一篇: 高效的TreeView构建方法
BlueDog
博客等级 码龄27年 104粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值