Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 快速I/O以检查目录是否包含文件_C#_.net - Fatal编程技术网

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

C# 快速I/O以检查目录是否包含文件,c#,.net,C#,.net,我正在用.NET 4编写一个C#应用程序,从目录列表中读取和处理数据文件(*.dat) 目前,我正在使用以下函数检查目录是否包含文件: private bool FilesPresent() { string[] DIRS = Directory.GetDirectories(dataFileDirectoryPath, "*.*", SearchOption.TopDirectoryOnly); foreach (string d in DIRS

我正在用.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;                
    }
我还尝试了以下帖子中的一些替代解决方案:

需要注意的是,有些目录的文件超过1000000个。即使是将百万以上的文件名读入字符串[]也需要很长时间

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


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

从.NET 4.0开始,有两种方法,
枚举目录
/
枚举文件
,它们惰性地枚举目录/文件

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 filepresent()
{

IEnumerable dirs=Directory.EnumerateDirectory(dataFileDirectoryPath,****),SearchOption.TopDirectoryOnly); foreach(dirs中的字符串d) { IEnumerable files=Directory.enumerated文件(d,“**”,SearchOption.AllDirectories); if(files.Any()){return true;} } 返回false; }
从技术上讲,您可以将其改写为:

private static bool FilesPresent()
{
    IEnumerable<string> dirs = Directory.EnumerateDirectories(dataFileDirectoryPath, "*.*", SearchOption.TopDirectoryOnly);
    return dirs.Any(d => Directory.EnumerateFiles(d, "*.*", SearchOption.AllDirectories).Any());
}
private static bool filepresent()
{

IEnumerable dirs=Directory.EnumerateDirectory(dataFileDirectoryPath,****),SearchOption.TopDirectoryOnly); 返回dirs.Any(d=>Directory.EnumerateFiles(d,“***”,SearchOption.AllDirectories.Any()); }

但我确实觉得这会使它更难阅读。

这里有另一种方法,使用LINQ和
枚举文件系统
+
所有目录

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

如果
FileAttribute.HasFlag(FileAttributes.Directory)
返回
false
这是一个文件。

可能重复的,我认为你不会比重复中的顶部答案更快。为什么不合适呢?
Directory.EnumerateDirectory(dataFileDirectoryPath,“***”,SearchOption.TopDirectoryOnly)。Any(d=>Directory.EnumerateFiles(d,“***”,SearchOption.AllDirectory)。Any())
Directory.EnumerateDirectory(folderPath,SearchOption.TopDirectoryOnly)。SelectMany(x=>x.EnumerateFiles()).Any();哇!现在速度快多了!非常感谢您的回答,非常感谢。