使用IEnumerable <fileinfo> .Count&lt;&gt;时忽略异常并跳过文件/目录</fileinfo>

时间:2014-12-18 00:15:42

标签: c#

我正在寻找获取驱动器上文件数量的最快方法。到目前为止,我使用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,我个人并不关心它是一行还是四行。但这是一个很好的例子,如果有一般方法可以学习。

1 个答案:

答案 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();
        }