C# 快速I/O以检查目录是否包含文件
我正在用.NET 4编写一个C#应用程序,从目录列表中读取和处理数据文件(*.dat) 目前,我正在使用以下函数检查目录是否包含文件: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
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();哇!现在速度快多了!非常感谢您的回答,非常感谢。