我正在寻找获取驱动器上文件数量的最快方法。到目前为止,我使用DirectoryInfo.EnumerateFiles
。
DirectoryInfo rootDirectory = new DirectoryInfo(@"C:\");
IEnumerable<FileInfo> filesInRootDirectory = rootDirectory.EnumerateFiles("*", SearchOption.AllDirectories);
int c = 0;
foreach(FileInfo currentFile in filesInRootDirectory)
{
//TODO: Skip if currentFile has file attribute "ReparsePoint"
c++;
}
但是使用IEnumerable<FileInfo>.Count<>
方法还有一个更短的方法。
DirectoryInfo rootDirectory = new DirectoryInfo(@"C:\");
IEnumerable<FileInfo> filesInRootDirectory = rootDirectory.EnumerateFiles("*", SearchOption.AllDirectories);
int c = filesInRootDirectory.Count<FileInfo>();
不幸的是,枚举在System.UnauthorizedAccessException
之类的重新分析点上进行枚举时会抛出C:\Documents and Settings
。有没有办法只使用Count&lt;&gt;跳过这些目录方法,同时保持比第一种方式更短?
PS,我个人并不关心它是一行还是四行。但这是一个很好的例子,如果有一般方法可以学习。
答案 0 :(得分:-1)
它不一定更高效,但您可以使用像
这样的LINQ语句DirectoryInfo rootDirectory = new DirectoryInfo(@"C:\");
IEnumerable<FileInfo> filesInRootDirectory = rootDirectory.EnumerateFiles("*", SearchOption.AllDirectories);
int c = filesInRootDirectory.Count(x => !x.Attributes.HasFlag(FileAttributes.ReparsePoint));
更新:
经过测试并从MSDN中获取作品,但您必须以管理员身份运行。
int count = 0;
DirectoryInfo diTop = new DirectoryInfo(@"c:\");
try
{
foreach (var fi in diTop.EnumerateFiles())
{
try
{
count++;
}
catch (UnauthorizedAccessException UnAuthTop)
{
Console.WriteLine("{0}", UnAuthTop.Message);
}
}
foreach (var di in diTop.EnumerateDirectories("*"))
{
try
{
foreach (var fi in di.EnumerateFiles("*", SearchOption.AllDirectories))
{
try
{
count++;
}
catch (UnauthorizedAccessException UnAuthFile)
{
Console.WriteLine("UnAuthFile: {0}", UnAuthFile.Message);
}
}
}
catch (UnauthorizedAccessException UnAuthSubDir)
{
Console.WriteLine("UnAuthSubDir: {0}", UnAuthSubDir.Message);
}
}
}
catch (DirectoryNotFoundException DirNotFound)
{
Console.WriteLine("{0}", DirNotFound.Message);
}
catch (UnauthorizedAccessException UnAuthDir)
{
Console.WriteLine("UnAuthDir: {0}", UnAuthDir.Message);
}
catch (PathTooLongException LongPath)
{
Console.WriteLine("{0}", LongPath.Message);
}
Console.WriteLine(count);
Console.ReadLine();
}