尝试获取与给定掩码匹配的文件夹的所有文件的计数,但希望避免返回每个匹配项甚至列表的费用,因为可能存在数万个匹配项。
我可以FindNextFile
反复做直到完成,但这是很多昂贵的往返。
有没有方便的功能?
这是现在使用的代码,因为我需要的只是计数,所以寻找一种成本更低的方法来实现:
string[] files = System.IO.Directory.GetFiles(Path, InFileMask);
if (files.Length == ExpectedCount)
您应该能够通过使用Microsoft Indexing Service来实现这一点。这里还有另一篇文章。不幸的是,它并不总是在每个系统上都处于活动状态,因此并不完全可靠。
更好的选择是实现您自己的索引服务。您可以在应用程序启动时扫描整个 PC,并依靠 FileSystemWatcher 来侦听系统上的文件更改。通过这种方式,您可以实现非常快速的文件枚举,并且您将能够在更少的微秒内返回文件计数。
一种更简单的方法是使用出色的Faster Directory Enumeration Tool,它还具有可以处理此问题的掩码/过滤器支持。例如
var filesCount = FastDirectoryEnumerator.GetFiles(Path, InFileMask).Length;
如果这确实是一个问题(要搜索数以万计的文件名,并且要完成数以千计的不同搜索),那么最简单的(无需编写大量代码)可能是将文件名缓存在索引数据库表中,然后使用SQL 来做计数。在将文件名复制到数据库并为表建立索引之后,任何体面的 SQL 引擎都应该在每个单独的搜索中做得很好——我自己会使用 SQLite。
障碍将使缓存保持最新。这有多痛苦将取决于您尝试做什么。