如何枚举C:和所有子文件夹的根

时间:2012-02-19 19:33:20

标签: c# .net

我在这里有点困惑。我编写了以下脚本,将某个扩展类型的文件添加到List中,并且它可以正常工作,而不是C的根:这是代码优先...

        // Create an empty list
        List<string> scanFiles = new List<string>();

        // Split possible extention list into array
        string[] scanExtensions = @"exe,com".Split(',');

        try
        {
            foreach (string extension in scanExtensions)
            {
                // Add collection for this filetype to the list of files
                scanFiles.AddRange(Directory.GetFiles("C:\\", "*." + extension, SearchOption.AllDirectories));
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("ERROR: " + ex.Message);
        }

        // Display results
        foreach(string sf in scanFiles)
        {
            Console.WriteLine(sf);
        }

因此,如果我运行上面的代码,我会收到错误 - 但不是我期望的错误。它显示以下内容......

错误:拒绝访问路径'C:\ Documents and Settings \'。

如果我没有指定'C:\'作为目录路径,我会理解这一点!如果我将其更改为任何有效的目录(如C:\ Program Files),代码工作正常。谁能解释一下呢?

谢谢, 西蒙

3 个答案:

答案 0 :(得分:2)

好吧,名为“拒绝访问”的错误消息的原因是......您无法访问该文件夹!

尝试在Windows资源管理器中单击它。您会注意到,事实上,您无法访问它。多么令人惊讶;-)这条消息告诉你的确如此。

SearchOption.AllDirectories意味着GetFiles将递归枚举所有文件。如果它遇到错误某处,它将引发异常。没有办法改变它。

您无法使Directory.GetFiles忽略访问被拒绝的错误。因此,您必须编写自己的文件系统枚举代码。它可能是一个递归函数,其中包含一些错误处理代码。

答案 1 :(得分:2)

SearchOption.AllDirectories表示您的代码将深入到(禁止)区域。

最好准备好处理这种错误。对于没有捕获异常的解决方案,您需要DirectoryInfo.GetFiles()来获取FileInfo对象而不是字符串,并提前验证您的访问权限。

但是由于并发性,你仍然需要处理异常(找不到文件/目录),所以你可能会忘记FileInfo

答案 2 :(得分:2)

您根据documentation表示

指定了SearchOption.AllDirectories
  
    

AllDirectories在搜索操作中包含当前目录和 所有子目录 。此选项包括重新分析点,如安装的驱动器和搜索中的符号链接。

  

换句话说,您的搜索是递归的,然后向下进入您没有读取权限的Documents and Settings