我试图让旧式VB6应用程序读取一个大的(大于2GB)二进制文件。我将缓冲区声明为:
Dim TCBuffer as String
TCPBuffer = String(4096, Chr(0))
使用以下方法在循环中读取数据:
Get #FileNum, , TCPBuffer
但是一旦当前位置达到2GB,上面的行会引发错误。
运行时错误' 63':
记录号错误
所以我想知道如何使用Scripting.FileSystemObject
。但是,看来这个对象非常有限。首先,它似乎只能创建和打开文本文件。
关于如何从VB6读取大型二进制文件的任何建议?
更新
再考虑一下,另一种选择是使用API函数。但这里VB6的一个真正局限是缺少无符号数据类型。因此,即使使用API函数也是一种技巧。
答案 0 :(得分:0)
您最好的选择可能是使用Windows API对内存映射文件,使用CreateFile
,CreateFileMapping
和MapViewOfFile
函数。请参阅" Creating a File Mapping object"上的Microsoft文档。有关API如何工作的更多信息,但显然您需要translate VB的细节。我做了一些搜索,发现some old articles still around有一些指针和一个archive of sample code from Visual Basic Programmer's Journal(参见" The Persistence Of Memory(1996年7月)"),所以你不是唯一需要这样做的人,这似乎是一种既定的技术。请注意,对于32位进程中较大的文件,您需要一次将部分文件映射到地址空间。
答案 1 :(得分:0)
我最终创建了一个在内部使用Windows API的文件类。
任何接受或返回文件大小或偏移量的函数的类型为Double
。即使将其传递给API时,也必须将其存储在带符号的Long
中,但只需少量代码即可将其与无符号的长整数进行转换(因为VB6 / VBA不支持无符号的长整数)。