快速I/O检查目录是否包含文件
本文关键字:是否 包含 文件 检查 快速 | 更新日期: 2023-09-27 18:04:20
我正在用。net 4编写一个c#应用程序,从目录列表中读取和处理数据文件(*.dat)。
当前,我正在使用以下函数检查目录是否包含文件:
private bool FilesPresent()
{
string[] DIRS = Directory.GetDirectories(dataFileDirectoryPath, "*.*", SearchOption.TopDirectoryOnly);
foreach (string d in DIRS)
{
string[] FILES = Directory.GetFiles(d, "*.*", SearchOption.AllDirectories);
if (FILES.Length > 0) { return true; }
}
return false;
}
我也尝试了以下帖子中的一些替代解决方案:如何快速检查文件夹是否为空(.NET)?
重要的是要注意,有些目录的文件超过1,000,000个。即使将100万个以上的文件名读入字符串[]也要花费很长时间。
我如何实现这个不同,使它运行得更快?
简单地说;我想知道检查目录是否为空的最快方法。此时,我不关心检索文件名。
从。net 4.0开始,有两个方法EnumerateDirectories
/EnumerateFiles
惰性枚举目录/文件。
private static bool FilesPresent()
{
IEnumerable<string> dirs = Directory.EnumerateDirectories(dataFileDirectoryPath, "*.*", SearchOption.TopDirectoryOnly);
foreach (string d in dirs)
{
IEnumerable<string> files = Directory.EnumerateFiles(d, "*.*", SearchOption.AllDirectories);
if (files.Any()) { return true; }
}
return false;
}
技术上可以重写为:
private static bool FilesPresent()
{
IEnumerable<string> dirs = Directory.EnumerateDirectories(dataFileDirectoryPath, "*.*", SearchOption.TopDirectoryOnly);
return dirs.Any(d => Directory.EnumerateFiles(d, "*.*", SearchOption.AllDirectories).Any());
}
这是使用LINQ和EnumerateFileSystemEntries
+ AllDirectories
的另一种方法:
bool noFiles = !Directory.EnumerateFileSystemEntries(dataFileDirectoryPath, "*.*", SearchOption.AllDirectories)
.Any(entry => !File.GetAttributes(entry).HasFlag(FileAttributes.Directory));
如果FileAttribute.HasFlag(FileAttributes.Directory)
返回false
,它是一个文件