1

在 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);
4

2 回答 2

3

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

编辑: 考虑关于 SO 的类似问题:

于 2013-08-29T06:45:33.240 回答
2

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

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

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

于 2013-08-29T07:39:29.407 回答