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

时间:2008-12-08 11:30:55

标签: c# .net file-io

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

4 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分:7)

我做了一点测试 - 在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

答案 2 :(得分:3)

没有更快的方法。无论您使用什么,都归结为FindFirstFileFindNextFile Win32通话 您可以尝试使用类似this的内容,但它可能需要花费同样多的时间 - 但可能会减少内存使用量(=可能不值得)。

答案 3 :(得分:1)

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

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