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
原创粉丝点击