VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
12
返回列表 发新帖
楼主: 业余的业余

vb6读取大文件时,读取位置达到最大值后如何继续读后面的数据?

[复制链接]
发表于 2020-5-21 21:01:47 | 显示全部楼层
内存文件映射?

点评

就是常规操作。没有用到内存文件映射技术。  发表于 2020-5-22 08:57
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-22 08:55:05 | 显示全部楼层
jy4977596491 发表于 2020-5-21 18:10
api_openfile大有问题,windows没有这个API,只有openfile,显然是封装过的,具体只能跟踪进去分析这个函数

api_openfile封装不复杂啊,有没有问题请看如下代码:
Public Sub API_OpenFile(ByVal FileName As String, ByRef FileNumber As Long, ByRef FileSize As Currency)
Dim FileH As Long
Dim Ret As Long
On Error Resume Next
FileH = CreateFile(FileName, GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0&, OPEN_EXISTING, 0, 0)
If Err.Number > 0 Then
    Err.Clear
    FileNumber = -1
Else
    FileNumber = FileH
    Ret = SetFilePointer(FileH, 0, 0, FILE_BEGIN)
    Call API_FileSize(FileH, FileSize)
End If
On Error GoTo 0
End Sub
Public Sub API_FileSize(ByVal FileNumber As Long, ByRef FileSize As Currency)
    Dim FileSizeL As Long
    Dim FileSizeH As Long
    FileSizeH = 0
    FileSizeL = GetFileSize(FileNumber, FileSizeH)
    Long2Size FileSizeL, FileSizeH, FileSize
End Sub
===========================================================
有关API的定义:
Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, ByVal lpOverlapped As Any) 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 Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Long, ByVal lDistanceToMove As Long, lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long
Private Declare Function GetFileSize Lib "kernel32" (ByVal hFile As Long, lpFileSizeHigh As Long) As Long
常量定义就不贴上来了。
回复 支持 反对

使用道具 举报

发表于 2020-5-22 09:12:40 | 显示全部楼层
代码好像是没错,但是写得也够累的,On Error什么的根本不需要,API和VB的open打开文件不一样,不会报错的,只需判断文件句柄是否为-1就行,当为-1说明句柄无效,ByVal FileNumber As Long 是文件号,和VB的open不同,应该命名成hFile as long,才叫文件句柄,以后免得产生歧义
回复 支持 反对

使用道具 举报

发表于 2020-5-22 09:14:05 | 显示全部楼层
jy4977596491 发表于 2020-5-22 09:12
代码好像是没错,但是写得也够累的,On Error什么的根本不需要,API和VB的open打开文件不一样,不会报错的 ...

还有err.number、err.clear、on error goto 0都不需要

点评

API_OpenFile(ByVal FileName As String, ByRef FileNumber As Long, ByRef FileSize As Currency) FileName 只是一个String,为何必须要通过CD.FileName来经手,直接把文件路径付给他就是不行,不理解。  发表于 2020-5-22 11:23
回复 支持 反对

使用道具 举报

发表于 2020-5-22 09:38:04 | 显示全部楼层
你之前的代码中用CreateFile后没有CloseHandle,会出现第一次打开正常,第二次打开同文件会出现失败,因为句柄没有关闭,用CreateFile或OpenFile操作过文件后要CloseHandle,也就是说OpenFile和CloseHandle是配对用的

点评

CloseHandle这个有的,只是没有贴出来。而且文件打开了,我也匹配了关闭语句的。  发表于 2020-5-22 11:21
回复 支持 反对

使用道具 举报

发表于 2020-5-22 12:24:07 | 显示全部楼层
那么我可以告诉你API是没有问题的,问题出在你的调用上,所以剩下的就是分析每行代码找出问题
回复 支持 反对

使用道具 举报

发表于 2020-5-22 12:26:03 | 显示全部楼层
jy4977596491 发表于 2020-5-22 12:24
那么我可以告诉你API是没有问题的,问题出在你的调用上,所以剩下的就是分析每行代码找出问题

将重要的代码提取出来,放到新工程测试,测试完成再放进去,一个人做工程你得学会分而治之

点评

重启之后直接赋文件路径,测试正确。估计是之前测试的时候,没有CloseHandle,所以出问题了。  发表于 2020-5-22 21:49
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2021-1-28 07:25

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表