如何获取锁定文件的大小
how to get size of a locked file?
我尝试使用这种方法:
#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。但非系统应用可以看到锁定文件的大小。例如,总指挥官给了我大约 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.n文件大小高/低为您提供所需的信息。
您获得的实际数字并不可靠,它只是一个快照,很可能已经过时。 特别是对于分页文件,Windows可以快速更改其大小。 获得可靠的大小需要锁定文件,以便没有人可以像您一样更改它。 这不适用于分页文件,操作系统会对其保持硬锁,因此没有人可以弄乱文件内容或从文件中读取安全敏感数据。
根据 MSDN,如果您只需要信息而不打开文件,则应将 dwDesiredAccess
参数设置为 0(零)。
相关文章:
- 使用文件锁定的进程之间的条件变量
- 如何测试文件是否被锁定和/或只读而不打开?
- 我可以在C 中的Windows中读取一个文件,而无需锁定包含文件的文件夹
- 如何判断当前过程是否已经锁定文件
- C# 读取完全锁定的文本文件或读取 if 语句外部的输出
- Apache在PHP文件上保持文件锁定,直到关闭
- 在C++中锁定和解锁文件
- C++Ubuntu在终止时未释放锁定文件上的锁定
- 我可以在锁定文件后复制文件吗?
- 使用 boost::interprocess::file_lock 创建一个锁定的文件
- 锁定文件,避免使用相同的过程以访问两次
- 正在为编写者和读者寻找最佳的增强文件锁定机制
- 我创建锁定文件的功能导致访问冲突
- 如果原始文件被锁定,是否可以从装载点读取
- 如何确保我的进程永远不会将另一个进程锁定在文件之外
- FindFirstChangeNotification 锁定父文件夹
- 视窗C++ 锁定内存中的文件
- 正在释放Qt中的文件锁定
- C++中的文件锁定用于同时读取和写入锁定
- C++:线程和进程之间的文件锁定