VB读取超过2G的数据文件
来源:互联网 发布:ubuntu os update 编辑:程序博客网 时间:2024/05/16 08:22
VB读取超过2G的数据文件
在VB中数据超过2G后很多函数、变量都无法用了。
其测试发现也很简单的。
CreateFile打开文件取文件号.
WriteFile写文件
ReadFile读文件
SetFilePointer记录文件位置
GetFileSizeEx取文件大小
当使用getfilesizeEx 取出的值为货币式。
那么如何取数据了。
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
将要获取的文件记录位置数值货币类型转换为大整数结构
CopyMemory大整数结构,货币类型记录数值, 8
例如:
Option ExplicitPrivate Const OFS_MAXPATHNAME = 128Private Type OFSTRUCT cBytes As Byte fFixedDisk As Byte nErrCode As Integer Reserved1 As Integer Reserved2 As Integer szPathName(OFS_MAXPATHNAME) As ByteEnd TypePrivate Const OF_READ = &H0Private Const OF_WRITE = &H1Private Const FILE_BEGIN = 0Private Const FILE_END = 2Private Const FILE_SHARE_READ = &H1Private Const FILE_SHARE_WRITE = &H2Private Const CREATE_NEW = 1Private Const CREATE_ALWAYS = 2Private Const OPEN_EXISTING = 3Private Const OPEN_ALWAYS = 4Private Const GENERIC_READ = &H80000000Private Const GENERIC_WRITE = &H40000000Private Const MOVEFILE_REPLACE_EXISTING = &H1Private Const FILE_ATTRIBUTE_TEMPORARY = &H100Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length 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 Any) As LongPrivate Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As Any) As LongPrivate Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As LongPrivate Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As LongPrivate Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Long, ByVal lDistanceToMove As Long, lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As LongPrivate Declare Function GetFileSize Lib "kernel32" (ByVal hFile As Long, lpFileSizeHigh As Long) As LongPrivate Declare Function SetEndOfFile Lib "kernel32" (ByVal hFile As Long) As LongPrivate Declare Function GetFileSizeEx Lib "kernel32" (ByVal hFile As Long, lpFileSize As Currency) As BooleanPrivate Declare Function OpenFile Lib "kernel32" (ByVal lpFileName As String, lpReOpenBuff As OFSTRUCT, ByVal wStyle As Long) As LongPrivate Const FILE_SIZE_L As Long = 81920Private Sub Command1_Click() 'Currency的取值范围是-922,337,203,685,477.5808 到 922,337,203,685,477.5807, '在内存中的表示形式为从 &H8000000000000000 到 &H7FFFFFFFFFFFFFFF Dim hFile As Long Dim sFileName As String Dim d As Currency '货币值 Dim f As Long Dim nSize As Currency Dim b(100) As Byte Dim c(100) As Byte Dim a As Double ' 双精度 '2147483648 表示:1024*1024*1024=1G 1G*2=2147483648 '-100 表示读取100字节 -2空间字节 '2147483546~2147483646 (100字节) a = 2147483546# sFileName = "F:\windos word\GWIN7.GHO" Open sFileName For Binary As #1 '当a超过读取范围值(100)和2个空间字节长度就会出现错误 Get #1, a, b Close #1 '======================================================== 2G后面的数据 '取文件句柄 hFile = CreateFile(sFileName, GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0&, OPEN_EXISTING, 0, 0) GetFileSizeEx hFile, nSize '文件总长度 '地2147483645 就是上面的最后一个字节值 后面就是超过2后的字节数据. d = 2147483645@ / 10000@ CopyMemory f, d, 8 '货币值转换 SetFilePointer hFile, f, 0, 0 '这个函数相当于文件记录位置 ReadFile hFile, c(0), 100 + 1, 0, ByVal 0& 'get数据 读 'WriteFile hFile, c(0), 100 + 1, 0, ByVal 0& 'put数据 写 CloseHandle hFile '关闭文件 MsgBox "B尾部最后一个字节值:" & b(100) MsgBox "c头部一个字节值:" & c(0)End Sub
其实发现:前面加上 On Error Resume Next 也可以获取数据,还能写入。不可思议。
源码:
http://download.csdn.net/detail/qwer430401/8907497
0 0
- VB读取超过2G的数据文件
- win32读取超过2G大文件的解决办法
- 处理超过 2G 的 DBF 表
- 处理超过 2G 的 DBF 表
- 9i中单个数据文件超过32G?
- Oracle单个数据文件超过32G后扩容
- Oracle单个数据文件超过32G后扩容
- vb.net读取dbf、Excel、Access数据文件
- python 数据文件的读取
- 关于获得文件超过2G,超过4G文件大小的方法
- Oracle数据库中使用超过2G的内存
- 获取文件大小,尤其是超过2G的大文件
- Outlook容量超过2G的处理办法
- Oracle数据库中如何使用超过2G的内存
- linux环境下读写超过2G的大文件
- 访问超过 2G的问题 -- 未测试
- linux c 读写超过2G的大文件解决办法
- Aix 下打开超过2G的文件
- 学期结束..
- 65 模型层thinkphp看书总结
- 【Android】自定义相机的实现(支持连续拍照、前后摄像头切换、连续对焦)
- 除非万不得已,别 Catch!
- 在 Java EE 组件中使用 Camel Routes
- VB读取超过2G的数据文件
- Kth Smallest Element in a BST
- 阿里云ECS(linux)修改myspl数据库密码
- SQLServer事务获取表中自增ID的方法
- 阿里云云服务器ECS使用WordPress博客平台镜像版本操作过程
- 理解Java中的equalas和hashcode方法
- 黑马程序员-IOS学习笔记 OC创建对象时 系统做了些什么
- 黑马程序员-IOS学习笔记 OC 关于对象方法类方法的一些概念
- 套UpdatePanel控件导致jq相关事件失效解决办法