如何通过Windows API获取文件夹大小

How to get a folder size via Windows API

本文关键字:文件夹 获取 API 何通过 Windows      更新时间:2023-10-16

在Windows操作系统上,我们可以右键单击文件夹,它将显示包含文件夹大小信息的属性信息。现在,我想使用Windows API来获取文件夹大小,我不想使用FindFirstFile/FindNextFile来枚举所有文件。提前谢谢。

我尝试了下面的代码,但是,它返回的大小是无效数据。

HANDLE hFile = CreateFile(tsFolderPath.c_str(), GENERIC_READ, FILE_SHARE_READ, 
    NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_BACKUP_SEMANTICS, NULL); 
LARGE_INTEGER fileSize; 
GetFileSizeEx(hFile, &fileSize);
CloseHandle(hFile);

据我所知,没有API函数可以直接检索文件夹的大小。您必须对包含的文件进行迭代。

编辑:考虑SO:上的类似问题

  • 如何查找文件夹中所有文件的大小
  • 目录的大小

您的问题有几个答案,尽管其中一个主要是技术性的。

第一种方法是使用NtQueryInformationFile(或zwQueryInformationFile)来收集数据。这可以在一次调用中返回目录中所有文件的信息,避免了正常函数所需的循环。不过,使用起来有些棘手——文档主要针对设备驱动程序。使用它的应用程序是本机应用程序,而不是Win32。这方面的文档是最少的。

第二种可能性是编写一个循环,但使用FindFirstFileEx而不是FindFirstFile。这使您可以指定FindExInfoBasicFIND_FIRST_EX_LARGE_FETCH来优化检索,因为您不需要cAlternateFilename,并且将枚举目录中的所有文件,因此它应该一次读取尽可能多的相关数据。