操作系统:WINDOWS_XP
说明:
程序的目地是通过递归算法遍历指定路径下,所有目录及其子目录。下面的代码当遇到无权限访问的目录时,程序中断执行(如:System Volume Information目录),有什么办法可以略过这些目录,让程序断续向下执行呢?请大侠们指点!!谢谢。
代码(还未完成):
private void FindBrothers(string targetPath)
        {
            try
            {
                string[] directoryName = Directory.GetDirectories(targetPath);
                if (directoryName.Length != 0)
                {
                    foreach (string dirName in directoryName)
                    {
                        FindBrothers(dirName);
                        textBoxMessage.Text += dirName + "\r\n";
                    }
                }
            }
            catch (UnauthorizedAccessException e)
            {
                textBoxMessage.Text = e.Message + "===>忽略对此目录的处理!\r\n";
            }
            catch (Exception e)
            {
                textBoxMessage.Text = e.Message;
            }
        }

解决方案 »

  1.   

    还是先搞清楚为什么会无权访问吧。。请下面的解答。。foreach 是无序的,好像不容易定位到指定地方
      

  2.   

    try catch 了就行啊
    catch的时候continue就可以了
      

  3.   

    try
    {
    foreach (string dirName in directoryName)
     {
         FindBrothers(dirName);
         textBoxMessage.Text += dirName + "\r\n";
     }
    }
    catch()
    {}
      

  4.   

    foreach (string dirName in directoryName) 

        try 
        { 
            FindBrothers(dirName); 
        }catch{}
        textBoxMessage.Text += dirName + "\r\n"; 

      

  5.   

    获取目录权限实现判断

     string[] directoryName = Directory.GetDirectories(targetPath);
                    if (directoryName.Length != 0)
                    {
                        foreach (string dirName in directoryName)
                        {try
                           {
                            FindBrothers(dirName); 
                            textBoxMessage.Text += dirName + "\r\n";
                            }
                          catch{ FindBrothers(dirName); 
    }
                        }
                    }
      

  6.   


    class Program
        {
            static int i = 0;
            static void Main(string[] args)
            {
                string strPath = Console.ReadLine();
                DirectoryInfo di = new DirectoryInfo(strPath); 
                Console.WriteLine(di.Name);
                OutPutFiles(di);               Console.ReadLine();
            }        /// <summary>
            /// 打印输入路径中的所有子文件和子文件夹
            /// </summary>
            /// <param name="di">要显示的路径</param>
            static void OutPutFiles(DirectoryInfo di)
            {
                try
                {
                    foreach (FileSystemInfo fsi in di.GetFileSystemInfos())
                    {
                        i++;
                        OutputSpace(i);
                        Console.WriteLine(fsi.Name);
                        if ((fsi as DirectoryInfo)!=null)
                        {
                            OutPutFiles((DirectoryInfo)fsi);
                        }
                        i--;
                    }
                }
                catch {}            
            }        /// <summary>
            /// 打印阶梯空格以显示文件等级
            /// </summary>
            /// <param name="i">等级标识</param>
            static void OutputSpace(int i)
            {
                for (int j = 0; j < i; j++)
                {
                    Console.Write("    ");
                }
            }
        }
      

  7.   

    感觉是try..catch的位置没放对
    改成
                 string[] directoryName = null;
               try
               {
                    directoryName = Directory.GetDirectories(targetPath);
               }
               catch (UnauthorizedAccessException e)
                {
                    textBoxMessage.Text = e.Message + "===>忽略对此目录的处理!\r\n";
                }
                catch (Exception e)
                {
                    textBoxMessage.Text = e.Message;
                }
                   if (directoryName.Length != 0)
                    {
                        foreach (string dirName in directoryName)
                        {
                            FindBrothers(dirName);
                            textBoxMessage.Text += dirName + "\r\n";
                        }
                    }
    应该就可以了
      

  8.   

        if (directoryName.Length != 0) 这句改成    if (directoryName != null && directoryName.Length != 0) 
      

  9.   

    我给出的代码没有错,当然大家给的意见也非常的正确(实际代码中我采用了hzzasdf兄的风格)。该死啊~~~因为输入代码的时候应打成“+=”(确打成“=”)在这个语句上:
    “textBoxMessage.Text = e.Message + "===>忽略对此目录的处理!\r\n"; ”所以,以前遍历目录路径的信息记录,被新的信息给覆盖了(只显示遇到System Volume Information目录前处理的几个目录信息,而System Volume Information目录巧和的是,它是程序最后一个处理的)。。误认为是处理到这个目录后,程序就中断了执行。。
      

  10.   

    更正一下~~异常处理还是我给出的方式合理,采用hzzasdf兄的风格效率没有我的高。因为会增加一次无谓的比较操作(发生异常后已经不需要再进行if (directoryName != null && directoryName.Length != 0) 比较了。)。