【问题标题】:How can I use a filesize in order to read a file in WinAPI?如何使用文件大小来读取 WinAPI 中的文件?
【发布时间】:2018-01-23 04:58:41
【问题描述】:

我用CreateFile 打开了一个文件,并将该句柄传递给GetFileSizeExSetFilePointerEx,它们都可以用来获取文件大小。然后我需要使用 ReadFile 或 ReadFileEx 将整个文件中的数据读入缓冲区。

我遇到的问题是GetFileSizeExSetFilePointerEx 都将文件大小提供为 LARGE_INTEGER 类型,但 ReadFile 需要一个 DWORD 来表示要读取的字节数。有什么解决方法吗?

【问题讨论】:

  • 与其将文件读入用户分配的缓冲区,不如考虑使用CreateFileMapping()MapViewOfFile() 将内存指针映射到文件数据。 CreateFileMapping() 支持超过 4GB 的文件,在 64 位 Windows 上,MapViewOfFile() 一次可以访问超过 4GB 的数据。但是,即使使用用户分配的缓冲区,您也确实不应该一次使用那么多顺序内存。有更好的方法可以使用更少量的内存来处理大量数据。
  • @remy 考虑将您的评论转化为答案。我想看看windows下的文件映射。

标签: c windows winapi


【解决方案1】:

是的。 ReadFileReadFileEx 都将 DWORD 作为参数。我猜那是因为微软认为它不可能一次读取超过 4GB。

常见的方法是使用LARGE_INTEGER 联合的LowPart,它的类型是DWORD

当然,您必须手动检查文件的大小是否小于 4GB,这意味着 HighPart 为零。如果不是,那么您必须多次调用ReadFile

例如:

LARGE_INTEGER li;
DWORD actuallyRead;
LPVOID lpBuf;
... (fills li and lpBuf) ...
result = ReadFileEx(
           hFile,
           lpBuf,
           li.LowPart,
           &actuallyRead,
           NULL
         );

【讨论】:

    猜你喜欢
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    相关资源
    最近更新 更多