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

时间:2015-07-24 08:01:32

标签: c# .net

我正在编写一个带有.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;                
    }

我还尝试了以下帖子中的一些替代解决方案:How to quickly check if folder is empty (.NET)?

重要的是要注意一些目录超过1,000,000个文件。即使将百万+文件名读入字符串[]也需要很长时间。

如何以不同的方式实现它以使其运行得更快?

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

2 个答案:

答案 0 :(得分:6)

从.NET 4.0开始,有两种方法WARN : org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 1062, SQLState: 23000 ERROR: org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Duplicate entry 'ROLE_MAINTENANCE-asdf' for key 'uni_username_role' WARN : org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Warning Code: 1062, SQLState: 23000 ... / 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;
}

但我觉得这会让它更难以理解。

答案 1 :(得分:3)

这是使用LINQ和EnumerateFileSystemEntries + AllDirectories的另一种方法:

bool noFiles = !Directory.EnumerateFileSystemEntries(dataFileDirectoryPath, "*.*", SearchOption.AllDirectories)
    .Any(entry => !File.GetAttributes(entry).HasFlag(FileAttributes.Directory));

如果FileAttribute.HasFlag(FileAttributes.Directory)返回false,则为文件。