Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何使用文件大小在WinAPI中读取文件?_C_Windows_Winapi - Fatal编程技术网

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下查看文件映射。