如何找出目录中有多少文件?

我需要计算目录中的文件数。 我可以使用System.IO.Directory.GetFiles()获取目录中所有文件的名称,并获取该数组的长度,但在大型目录上需要太长时间。 有没有办法获得计数而不必得到名字?

我不相信,不 – 至少不是在vanilla .NET中。 我怀疑这不是实际获取名称花费时间 – 这是操作系统遍历目录内部。 您可以通过P / Invoke进行Win32调用。

你正在查看的目录有多大? 一般来说,在目录中拥有超过几百个文件至少在传统上并不是一个好主意。 文件系统在这方面已经有所改进,但我不知道NTFS和Fat32的当前状态。

我做了一点测试 – 在C ++ / Qt和C ++ / CLI中编写了相同的任务:

 LARGE_INTEGER i1, i2; QueryPerformanceCounter(&i1); int count = IO::Directory::GetFiles(L"c:\\windows\\system32")->Length; QueryPerformanceCounter(&i2); __int64 result = i2.QuadPart - i1.QuadPart; 

结果大约是16.500.000

 LARGE_INTEGER i1, i2; QueryPerformanceCounter(&i1); intcount = QDir("c:/windows/system32").entryList(QDir::Files).count(); QueryPerformanceCounter(&i2); __int64 result += i2.QuadPart - i1.QuadPart; 

结果大约是2.100.000.000

文件数量为2125

没有更快的方法。 无论你使用什么,它都归结为FindFirstFileFindNextFile Win32调用。
你可以尝试使用这样的东西,但它可能需要花费同样多的时间 – 但可能会少用一点内存(=可能不值得)。

到目前为止,在我遇到的大多数语言中,只有通过遍历文件夹并计算文件才能获得此信息。 我怀疑有一个Windows API调用只能获得计数(但我可能会感到惊讶!)。
方法的优点:灵活性 – 您可以过滤掉一些文件类型,递归地向下走或忽略文件夹等。

如果方法对你来说很慢,也许你应该得到一个更好的方法,比如不创建一个充满目录信息的数组(需要时间来填充它!更不用说内存成本和垃圾收集时间)但是使用迭代器:多一点工作(但是一旦你获得了这个function,它总是在那里)但效率更高。