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

Posted

技术标签:

【中文标题】如何获取锁定文件的大小?【英文标题】:how to get size of a locked file? 【发布时间】:2013-02-02 16:20:33 【问题描述】:

我尝试过使用这种方法:

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

【问题讨论】:

你试过删除FILE_SHARE_WRITE标志吗? @AndyProwl:是的,在这种情况下它没有效果,仍然不好处理。 GetLastError() 说什么? @molbdnilo: (0x5) ERROR_ACCESS_DENIED 【参考方案1】:

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

你得到的实际数字并不可靠,它只是一个快照,很可能是陈旧的。特别是对于分页文件,Windows 可以迅速改变其大小。获得可靠的大小需要锁定文件,这样任何人都无法更改它,就像您所做的那样。这对分页文件不起作用,操作系统对其进行了硬锁定,因此没有人可以弄乱文件内容或从文件中读取安全敏感数据。

【讨论】:

嗯,有像 Unlocker 这样的工具可以解决这个问题。虽然不允许写入文件,但可以安全地复制它。 你在浪费时间尝试这个。解释这一点需要一本书,拿起一本 Windows Internals 以获得洞察力。 好吧,可能是。目前,您的解决方案是朝着正确方向迈出的一步。【参考方案2】:

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

【讨论】:

以上是关于如何获取锁定文件的大小?的主要内容,如果未能解决你的问题,请参考以下文章

I/O:FileLock

Node.js如何获取文件大小

RocketMq如何保证消费顺序

如何修复 LockObtainFailedException:锁定获取超时?

如何在纵向锁定设备时获取设备方向

Python:如何获取 PyQt5 中选定文件的文件大小?