我需要计算目录中的文件数。我可以使用System.IO.Directory.GetFiles()
获取目录中所有文件的名称,并获取该数组的长度,但在大型目录上需要太长时间。有没有办法获得计数而不必得到名字?
答案 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)
没有更快的方法。无论您使用什么,都归结为FindFirstFile
和FindNextFile
Win32通话
您可以尝试使用类似this的内容,但它可能需要花费同样多的时间 - 但可能会减少内存使用量(=可能不值得)。
答案 3 :(得分:1)
到目前为止,在我遇到的大多数语言中,只有通过遍历文件夹并计算文件才能获得此信息。我怀疑有一个Windows API调用只能获得计数(但我可能会感到惊讶!) 方法的优点:灵活性 - 您可以过滤掉一些文件类型,递归地向下走或忽略文件夹等。
如果方法对你来说很慢,也许你应该得到一个更好的方法,比如没有创建一个充满目录信息的数组(需要时间来填充它!更不用说内存成本和垃圾收集时间)但是使用迭代器:更多的工作(但是一旦你获得了这个功能,它总是在那里)但效率更高。