我正在编写一个带有.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个文件。即使将百万+文件名读入字符串[]也需要很长时间。
如何以不同的方式实现它以使其运行得更快?
简单地说;我想知道检查目录是否为空的最快方法。我不关心此时检索文件名。
答案 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
,则为文件。