C# 使用IEnumerable时忽略异常<;FileInfo>;。计数<&燃气轮机;并跳过文件/目录
我正在寻找最快的方法来获取驱动器上的文件数。到目前为止,我使用的是C# 使用IEnumerable时忽略异常<;FileInfo>;。计数<&燃气轮机;并跳过文件/目录,c#,C#,我正在寻找最快的方法来获取驱动器上的文件数。到目前为止,我使用的是DirectoryInfo.EnumerateFiles DirectoryInfo rootDirectory = new DirectoryInfo(@"C:\"); IEnumerable<FileInfo> filesInRootDirectory = rootDirectory.EnumerateFiles("*", SearchOption.AllDirectories); int c = 0; for
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++;
}
DirectoryInfo rootDirectory=newdirectoryinfo(@“C:\”);
IEnumerable filesInRootDirectory=rootDirectory.EnumerateFiles(“*”,SearchOption.AllDirectory);
int c=0;
foreach(filesInRootDirectory中的FileInfo currentFile)
{
//TODO:如果currentFile具有文件属性“RepassePoint”,则跳过
C++;
}
但是使用IEnumerable.Count
方法还有一种更短的方法
DirectoryInfo rootDirectory = new DirectoryInfo(@"C:\");
IEnumerable<FileInfo> filesInRootDirectory = rootDirectory.EnumerateFiles("*", SearchOption.AllDirectories);
int c = filesInRootDirectory.Count<FileInfo>();
DirectoryInfo rootDirectory=newdirectoryinfo(@“C:\”);
IEnumerable filesInRootDirectory=rootDirectory.EnumerateFiles(“*”,SearchOption.AllDirectory);
int c=filesInRootDirectory.Count();
不幸的是,枚举在重新分析点(如C:\Documents and Settings)上进行枚举时抛出了一个系统。UnauthorizedAccessException
。有没有一种方法可以使用Count方法跳过这些目录,同时使其比第一种方法短
我个人不在乎是一行还是四行。但是,如果有一种通用的方法,这是一个很好的学习示例。它不一定性能更好,但您可以使用LINQ语句,如
DirectoryInfo rootDirectory = new DirectoryInfo(@"C:\");
IEnumerable<FileInfo> filesInRootDirectory = rootDirectory.EnumerateFiles("*", SearchOption.AllDirectories);
int c = filesInRootDirectory.Count(x => !x.Attributes.HasFlag(FileAttributes.ReparsePoint));
对不起,这不是你想要的。我不明白这个问题。我会更新一个解决方案。抱歉,这行不通。它必须先找到文件,然后才能检查标志。查找文件将引发异常。必须有类似于SearchOptions的内容。忽略AccessExceptions
,以便EnumerateFiles
本身将跳过这些文件。只是一个警告,AccessExceptions几乎总是由于没有以管理员身份运行Visual Studio而导致的。@JohnSaunders,这是一个很好的提示,我明天会检查。@RaySuelzer,谢谢你的努力,但我用foreach做这件事没有困难。这是另一个问题。
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();
}