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

时间:2013-02-02 16:20:34

标签: c++ file winapi locking

我尝试过使用这种方法:

#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;
}

2 个答案:

答案 0 :(得分:6)

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

您获得的实际数字并不可靠,它只是一个快照,很可能是陈旧的。特别是对于分页文件,Windows可以快速改变其大小。获得可靠的大小需要锁定文件,以便没有人像你一样改变它。这对于页面文件不起作用,操作系统会对其进行硬锁定,因此没有人可以处理文件内容或从文件中读取安全敏感数据。

答案 1 :(得分:0)

根据MSDN,如果您只想要信息而不打开文件,则应将dwDesiredAccess参数设置为0(零)。