gpt4 book ai didi

c++ - 如何获取锁定文件的大小?

转载 作者:太空宇宙 更新时间:2023-11-04 15:47:12 24 4
gpt4 key购买 nike

我尝试过使用这种方法:

#include <windows.h>
#include <iostream>

int main() {
LARGE_INTEGER size;
HANDLE hFile = CreateFile("c:\\pagefile.sys", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE) return(1);
GetFileSizeEx(hFile, &size);
CloseHandle(hFile);
std::cout << size.QuadPart << std::endl;
}

但如您所见,我指向已锁定的“pagefile.sys”,程序遇到 INVALID_HANDLE_VALUE。但是非系统应用程序可以看到锁定文件的大小。例如 total commander 给了我大约 1GB 并且它必须从某个地方获取这个值(更不用说简单地右键单击该文件,但这是系统进程所以文件没有锁定到它)。那么,对于这种情况是否有任何 winapi 调用?

我已更新代码以包含建议的更正,但它仍然不起作用:

#include <windows.h>
#include <iostream>

int main() {
LARGE_INTEGER size;
HANDLE hFile = CreateFile("c:\\pagefile.sys", 0, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
std::cout << "GetLastError: " << GetLastError() << std::endl;
//says: 5 (0x5) ERROR_ACCESS_DENIED
if (hFile == INVALID_HANDLE_VALUE) return(1);
GetFileSizeEx(hFile, &size);
CloseHandle(hFile);
std::cout << size.QuadPart << std::endl;
}

最佳答案

您可以从文件的目录条目中获取信息,没有锁定它的机制。这需要 FindFirstFile/FindNextFile 来迭代目录。返回的 WIN32_FIND_DATA.nFileSizeHigh/Low 为您提供所需的信息。

您获得的实际数字并不可靠,它只是一个快照,很可能已过时。尤其是对于分页文件,Windows 可以快速更改其大小。获得可靠的大小需要锁定文件,这样就没有人可以像您一样更改它。这不适用于分页文件,操作系统对其进行硬锁定,因此没有人可以弄乱文件内容或从文件中读取安全敏感数据。

关于c++ - 如何获取锁定文件的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14663864/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com