Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用IEnumerable时忽略异常<;FileInfo>;。计数<&燃气轮机;并跳过文件/目录_C# - Fatal编程技术网

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