C 如何使用文件大小在WinAPI中读取文件?
我用C 如何使用文件大小在WinAPI中读取文件?,c,windows,winapi,C,Windows,Winapi,我用CreateFile打开了一个文件,并将该句柄传递到GetFileSizeEx和SetFilePointerEx中,这两个句柄都可以用来获取文件大小。然后我需要使用ReadFile或ReadFileEx将整个文件中的数据读入缓冲区 我遇到的问题是,GetFileSizeEx和SetFilePointerEx都提供了大整数类型的文件大小,但ReadFile使用DWORD表示要读取的字节数。有什么解决办法吗?有。两者都有,并将DWORD作为参数。我猜这是因为微软认为它不太可能一次读取超过4GB的
CreateFile
打开了一个文件,并将该句柄传递到GetFileSizeEx
和SetFilePointerEx
中,这两个句柄都可以用来获取文件大小。然后我需要使用ReadFile或ReadFileEx将整个文件中的数据读入缓冲区
我遇到的问题是,GetFileSizeEx
和SetFilePointerEx
都提供了大整数类型的文件大小,但ReadFile使用DWORD表示要读取的字节数。有什么解决办法吗?有。两者都有,并将DWORD
作为参数。我猜这是因为微软认为它不太可能一次读取超过4GB的数据
常用的方法是使用类型为DWORD的联合体的LowPart
当然,您必须手动检查文件大小是否小于4GB,这意味着HighPart
为零。如果不是,则必须对ReadFile
执行多个调用
例如:
LARGE_INTEGER li;
DWORD actuallyRead;
LPVOID lpBuf;
... (fills li and lpBuf) ...
result = ReadFileEx(
hFile,
lpBuf,
li.LowPart,
&actuallyRead,
NULL
);
对。两者都有,并将DWORD
作为参数。我猜这是因为微软认为它不太可能一次读取超过4GB的数据
常用的方法是使用类型为DWORD的联合体的LowPart
当然,您必须手动检查文件大小是否小于4GB,这意味着HighPart
为零。如果不是,则必须对ReadFile
执行多个调用
例如:
LARGE_INTEGER li;
DWORD actuallyRead;
LPVOID lpBuf;
... (fills li and lpBuf) ...
result = ReadFileEx(
hFile,
lpBuf,
li.LowPart,
&actuallyRead,
NULL
);
不要将文件读取到用户分配的缓冲区中,而是考虑使用<代码> CurATE FLIMEMAP()/<代码>和<代码> MavVIEW()/代码>将内存指针映射到文件数据。code>CreateFileMapping()支持超过4GB的文件,并且在64位Windows上
MapViewOfFile()
一次可以访问超过4GB的数据。不过,您确实不应该一开始就使用那么多的顺序内存,即使是使用用户分配的缓冲区。有更好的方法使用少量的内存来处理大量的数据。@ ReMy考虑把你的评论转换成答案。我希望看到Windows下的文件映射,而不是将文件读取到用户分配的缓冲区中,考虑使用<代码> CurATE FLIMEMAP()/<代码>和<代码> MavVIEW()/代码>将内存指针映射到文件数据。code>CreateFileMapping()支持超过4GB的文件,并且在64位Windows上MapViewOfFile()
一次可以访问超过4GB的数据。不过,您确实不应该一开始就使用那么多的顺序内存,即使是使用用户分配的缓冲区。有更好的方法使用少量的内存来处理大量的数据。@ ReMy考虑把你的评论转换成答案。我想在windows下查看文件映射。