快速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万个以上的文件名读入字符串[]也要花费很长时间。

我如何实现这个不同,使它运行得更快?

简单地说;我想知道检查目录是否为空的最快方法。此时,我不关心检索文件名。

快速I/O检查目录是否包含文件

从。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,它是一个文件