2013-08-29 97 views
0

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

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

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); 
+0

你知道属性页更新“文件夹大小”以及枚举包含的文件,不是吗?所以它仍然使用你想避免的FindFirstFile。你也必须这样做。 –

+0

@RomanR是什么。说的是真的。当您打开包含数千个文件和子文件夹的文件夹的属性页时,您将看到文件夹大小不断更新。 – mrt

+0

@RomanR。实际上,我尝试了枚举方法,但是,它似乎与系统磁盘上的操作系统属性结果(例如C:\)没有太大的一致性,我发现因为某些带有FILE_ATTRIBUTE_REPARSE_POINT的文件是一个符号链接,它将被计为两次。但是,我过滤后。我发现结果与OS不一样。并且有一些文件属性(http://msdn.microsoft.com/en-us/library/windows/desktop/gg258117(v=vs.85).aspx)那么正确的方法是什么?谢谢! –

回答

2

有一对夫妇回答你的问题,但一个主要是一个技术性问题。

第一个将使用NtQueryInformationFile(或zwQueryInformationFile)来收集数据。这可以在一次调用中返回目录中所有文件的信息,避免了正常功能所需的循环。使用虽然有点棘手 - 文档主要用于设备驱动程序。使用它的应用程序是本机应用程序而不是Win32。文档很少。

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

+0

对于系统磁盘,枚举时总大小与OS不一致。我发现FILE_ATTRIBUTE_REPARSE_POINT和FILE_ATTRIBUTE_NOT_CONTENT_INDEXED会影响很多结果。 –

+0

好吧,是的,重新分析点有一个不重要的含义:“此条目不是一个正常的文件,而是一个引用”。更高级的API尊重语义,执行重新分析,并将返回引用文件的大小而不是引用。 – MSalters

相关问题