遍历文件夹时怎么跳过拒绝访问的文件夹

时间:2022-10-12 12:26:14
我的系统是win7, 我用directoryinfo dir =new directoryinfo("c:\\");
再用dir.getdirectory();然后用foreach遍历文件夹,但是每当取得的文件夹是拒绝放问的话,就会终止遍历,请问要怎么跳过或者遇到时怎么继续?

40 个解决方案

#1


catch 掉啊

#2


你肯定装了360SD 

#3


在你的foreach中加try---catch(Exception ex) 就可以了。

#4


有用catch,但是catch 后,它不继续往下遍历了。
如果是出现其他的错误,会继续遍历,但是这个拒绝放问的错误,会立刻让遍历停止。

#5


我没装360杀毒。

#6


不会停止的
我刚才试了

 for (int i = 0; i < 1000; i++)
            {
                string sss = "sd" + i.ToString();
                try
                {
                    if (i == 5)
                    {
                        throw new Exception();
                    }
                }
                catch { }
            }

#7


我猜他的try catch 放在for的外层了。

#8


没问题

 ArrayList ssss = new ArrayList();
            for (int i = 0; i < 1000; i++)
            {
                ssss.Add(i);
            }
            foreach (int  s in ssss)
            {
                string sss = "sd" + s.ToString();
                try
                {
                    if (s == 5)
                    {
                        throw new Exception();
                    }
                }
                catch { }
            }

#9


for(.........)
{
    try
    {
        ......
    }
    catch
    {
        continue;
    }
}

#10


不是阿,你们用这个当然没问题,你们如果是win7, 试试获取c盘根目录的文件夹,当我遍历到system volume …那个文件夹,然后再继续取得该文件夹下的子文件夹,就出现错误,遍历停止。
你们实验要用我这种方法才知道是否会停止遍历。

#11


我试试 我是Win 7我现在遍历C文件夹

#12


把所有文件都显示,然后会看到某些文件夹有一个锁的图标,其中有某些是拒绝访问的,当取得那文件夹后,想要取得该文件夹下的子文件夹,就出错停止遍历。你们可以试试。

#13


我遍历 
C:\\System Volume Information
没错 
。。。都可以访问

#14


应该可以获取文件夹的属性的吧?!
判断一下是否是拒绝访问的,是就continue,不是就进入 。
我只是提供个思路,没怎么用过这个,⊙﹏⊙‖∣

#15


试试用getaccesscontrol先判断一下能不能访问

#16


访问没出错,你试试用dir.getdirectory()试试。

#17


GetDirectory()?
你把代码贴出来算了

#18



            DirectoryInfo Di = new DirectoryInfo("c:\\");
            try
            {
                foreach (FileInfo item in Di.GetFiles("*.*", SearchOption.AllDirectories))
                {
                    Console.WriteLine(item.FullName);
                }
            }
            catch (Exception Ex)
            { 
                MessageBox.Show(Ex.Message);
            }


我也想得到答案,关注!
15楼的使用 getaccesscontrol 也许能解决问题,但不会编码。

#19


你那里写错了,应该。

#20


引用 18 楼 spmzfz 的回复:
C# code

            DirectoryInfo Di = new DirectoryInfo("c:\\");
            try
            {
                foreach (FileInfo item in Di.GetFiles("*.*", SearchOption.AllDirectories))
          ……

 


            foreach (string d in GetAuthorizedDirectories("C:\\"))
            {
                 
                foreach (string d2 in GetAuthorizedDirectories(d))
                {
                    Response.Write(d2);
                }
            }

             public static string[] GetChildrenFiles(string path)
        {
            try
            {
                return Directory.GetDirectories(path);
            }
            catch 
            {
                return new string[0];
            }
        }

#21


引用 9 楼 ck11926375 的回复:
for(.........)
{
  try
  {
  ......
  }
  catch
  {
  continue;
  }
}



这个貌似对的

#22


引用 20 楼 ray_yang 的回复:
引用 18 楼 spmzfz 的回复:

C# code

DirectoryInfo Di = new DirectoryInfo("c:\\");
try
...


应该谢谢   Ray_Yang ,不过他写错了一个单词。
http://social.msdn.microsoft.com/Forums/de-DE/2212/thread/478d6fd5-8898-4c46-8c92-8ee0253c596c

#23


是啊写错了 那不是楼主发的帖子吗,

#24


我不是楼主,我帮楼主顶,我也想知道答案:

http://topic.csdn.net/u/20091001/18/df483f2e-2018-4376-ad9c-581a6d136750.html?89346

#25


catch 掉

哇 楼已经很高了

#26


我只路过~!

#27


1.用catch确实不行。
2.22楼帖的那个就是我在msdn社区里问的帖子,但是我按照他的写法来写,还是不行。
3.因为我的代码和9楼的模式不一样,所以并不能用continue

我贴上我的代码:



private void getdirs(string initialCatalog)
        {
            //当前路径
            DirectoryInfo root = new DirectoryInfo(initialCatalog);
            //取得当前文件夹名字,和关键字作对比。
            string dirName = root.Name;
            if (searchTag(dirName, textBoxTag.Text))
                listBoxResult.Items.Add(root.FullName);

            //取得当前文件夹下所有文件,和关键字作对比。
            FileInfo[] files = root.GetFiles();
            foreach (FileInfo file in files)
            {
                string fileName = "";
                if (file.Name.IndexOf('.') != -1)
                {
                    fileName = file.Name.Substring(0, file.Name.LastIndexOf('.'));
                }
                else fileName = file.Name;

                if (searchTag(fileName, textBoxTag.Text)) listBoxResult.Items.Add(file.FullName);
            }

            //取得当前文件夹下所有文件夹,并用递归继续遍历所有子文件夹。
            DirectoryInfo[] dirs = null;
            try
            {
                dirs = root.GetDirectories();
            }
            catch (UnauthorizedAccessException x) { MessageBox.Show(x.Message); }
            try
            {
                if (dirs != null)
                {
                    foreach (DirectoryInfo d in dirs)
                    {
                        getdirs(d.FullName);
                    }
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); listBoxResult.Items.Add("-----------------------错误----------------------------"); }
        }



大家可以看下,这是我的截图:

这是当访问到该文件夹时的提示:
[img=http://b36.photo.store.qq.com/http_imgload.cgi?/rurl4_b=f03f05a824bf754f05aee22b90c6faaaa337ad046521984a6b87f1233a00a6cc89a401e74d8e2e0df3806715f269eda067478f504a7a7923391e89f4e06336e522f3427ef2d9e7ef10bb06aeeba0380ba90e659b&a=42&b=36][/img]


我是用listbox查看已经扫描到的文件夹,然后作为item添加到listbox。
可以看到,捕捉到catch语句后,没有继续执行了。
这个最下面那行是catch代码里面加的。说明后边没有再执行了。
[img=http://b42.photo.store.qq.com/http_imgload.cgi?/rurl4_b=f03f05a824bf754f05aee22b90c6faaa44764fa419d9901f42cee7d2bc083451dc0486969bf1dc6fd47e92f94e3baae6198a90bd8c9b20dd4aa587420fb494c18ce9109985f883cdadb3cfb2fb2033f06d2472c2&a=41&b=42][/img]

#28


重新贴上图片:


遍历文件夹时怎么跳过拒绝访问的文件夹



遍历文件夹时怎么跳过拒绝访问的文件夹

#29


你到24楼里的进去看看,使用的是递归,好像能跳过错误 。。。

#30


24楼的都看过了。我也是用递归,不能跳过错误。很奇怪,扫描到拒绝访问的文件夹就会自动停止执行下边的代码,就算用try...catch...也一样。

我参考了msdn的MVP专家,用了另外一种比较不成方法的方法,问题可以解决,但是期待更好的方法出现:



        private void getdirs(string initialCatalog)
        {
            //当前路径
            DirectoryInfo root = new DirectoryInfo(initialCatalog);
            //取得当前文件夹名字,和关键字作对比。
            string dirName = root.Name;
            if (searchTag(dirName, textBoxTag.Text))
                listBoxResult.Items.Add(root.FullName);

            //取得当前文件夹下所有文件,和关键字作对比。
/*主要就是改了这里,当不能获取下一级的文件时,置files为Null,使他不继续向下遍历*/
            FileInfo[] files;
            try
            {
                 files= root.GetFiles();
            }
            catch { files = null; }
            if (files != null)
            {
                foreach (FileInfo file in files)
                {
                    string fileName = "";
                    if (file.Name.IndexOf('.') != -1)
                    {
                        fileName = file.Name.Substring(0, file.Name.LastIndexOf('.'));
                    }
                    else fileName = file.Name;

                    if (searchTag(fileName, textBoxTag.Text)) listBoxResult.Items.Add(file.FullName);
                }
            }

            //取得当前文件夹下所有文件夹,并用递归继续遍历所有子文件夹。
/*主要就是改了这里,当不能获取下一级的文件夹时,置dirs为Null,使他不继续向下遍历*/
            DirectoryInfo[] dirs = null;
            try
            {
                dirs = root.GetDirectories();
            }
            catch { dirs = null; }
            try
            {
                if (dirs != null)
                {
                    foreach (DirectoryInfo d in dirs)
                    {
                        getdirs(d.FullName);
                    }
                }
            }
            catch { listBoxResult.Items.Add("-----------------------错误----------------------------"); }
        }


#31


用for不要用foreach就可以了。

for可以解决问题。很久之前也出现过这样的问题。

#32


引用 31 楼 zanfeng 的回复:
用for不要用foreach就可以了。

for可以解决问题。很久之前也出现过这样的问题。


是在catch里面用continue解决的吗?

#33


有项目管理经验的.NET开发的朋友,加上限500人的QQ群28720769,一起交流。

#34


我总感觉有点“当不能获取下一级的文件夹时,置dirs为Null,使他不继续向下遍历”时,你把问题复杂化了。

        private void GetDir(string TempDirStr)
        {
            DirectoryInfo Di = new DirectoryInfo(TempDirStr );
            DirectoryInfo[] DIS = Di.GetDirectories();

            for (int i = 0; i < DIS.Length   ; i++)
            {
                try
                {
                    Console.WriteLine(DIS[i].FullName);
                    GetDir(DIS[i].FullName);
                }
                catch (Exception Ex)
                {
                    Console.WriteLine("WrongMsg: {0}", Ex.Message);
                    //continue;  //continue语句在这里好像不起作用。
                }
            }
        }



      private void button8_Click(object sender, EventArgs e)
        {
            GetDir(@"C:\Documents and Settings\All Users");
        }

#35



                dir = dirs.Dequeue();                           // 取一目录名   
                try  
                {   
                    string[] fs = Directory.GetFiles(dir);      // 获取该目录下的所有文件   
                    foreach (string f in fs)   
                    {   
                        while (pause || bw.CancellationPending) // 处理暂停及取消操作   
                        {   
                            if (bw.CancellationPending) return; // 用户取消   
                            Thread.Sleep(20);   
                        }   
                        bw.ReportProgress(1, f);                // 报告当前进度   
                        Thread.Sleep(interval);                 // 避免快速连续引发事件   
                    }   
                    fs = Directory.GetDirectories(dir);         // 获取目录下的所有子目录   
                    foreach (string d in fs)   
                    {   
                        dirs.Enqueue(d);                        // 各子目录入队   
                    }   
                }   
                catch                                           // 目录或文件无操作权限等   
                {   
                    continue;   
                }   


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sxldfang/archive/2010/04/25/5527456.aspx

#36


引用 32 楼 zexin1000 的回复:
引用 31 楼 zanfeng 的回复:
用for不要用foreach就可以了。

for可以解决问题。很久之前也出现过这样的问题。


是在catch里面用continue解决的吗?


这样只会抛异常啊!

#37


引用 32 楼 zexin1000 的回复:
引用 31 楼 zanfeng 的回复:
用for不要用foreach就可以了。

for可以解决问题。很久之前也出现过这样的问题。


是在catch里面用continue解决的吗?


好像使用for foreach 都一样,不需用 continue.
        private void GetDir(string TempDirStr)
        {
            DirectoryInfo Di = new DirectoryInfo(TempDirStr );
            DirectoryInfo[] DIS = Di.GetDirectories();

            foreach (DirectoryInfo  item in DIS )
            {
                try
                {
                    Console.WriteLine(item.FullName);
                    GetDir(item.FullName);
                }
                catch (Exception Ex)
                {
                    Console.WriteLine("WrongMsg: {0}", Ex.Message);
                }
            }
        }

我头有点晕了,有时间再来研究。

#38


如果不设置不能访问的为null,便不能跳过那些拒绝访问的文件夹,纯粹是遍历了。

#39


之前也碰到过这样的问题,帮顶。。。

#40


虽然是老贴了,但是碰到了就说一下.
本来我也很纠结这个弹错的.
但是貌似经过实验对比,并没有中断,完好的遍历了所需所有文件.
try了这里

        private void ProcessDirectory(string targetDirectory)
        {
            //检测3种文件
            try
            {
                string[] fileEntries1 = System.IO.Directory.GetFiles(@targetDirectory, "*.txt");
                string[] fileEntries2 = System.IO.Directory.GetFiles(@targetDirectory, "*.lrc");
                string[] fileEntries3 = System.IO.Directory.GetFiles(@targetDirectory, "*.krc");

                foreach (string fileName in fileEntries1)
                    ProcessFile(fileName);
                foreach (string fileName in fileEntries2)
                    ProcessFile(fileName);
                foreach (string fileName in fileEntries3)
                    ProcessFile(fileName);

                //检测子文件夹
                string[] subdirectoryEntries = System.IO.Directory.GetDirectories(@targetDirectory);
                foreach (string subdirectory in subdirectoryEntries)
                    ProcessDirectory(subdirectory);   //递归调用
            }
            catch { }
        }

#1


catch 掉啊

#2


你肯定装了360SD 

#3


在你的foreach中加try---catch(Exception ex) 就可以了。

#4


有用catch,但是catch 后,它不继续往下遍历了。
如果是出现其他的错误,会继续遍历,但是这个拒绝放问的错误,会立刻让遍历停止。

#5


我没装360杀毒。

#6


不会停止的
我刚才试了

 for (int i = 0; i < 1000; i++)
            {
                string sss = "sd" + i.ToString();
                try
                {
                    if (i == 5)
                    {
                        throw new Exception();
                    }
                }
                catch { }
            }

#7


我猜他的try catch 放在for的外层了。

#8


没问题

 ArrayList ssss = new ArrayList();
            for (int i = 0; i < 1000; i++)
            {
                ssss.Add(i);
            }
            foreach (int  s in ssss)
            {
                string sss = "sd" + s.ToString();
                try
                {
                    if (s == 5)
                    {
                        throw new Exception();
                    }
                }
                catch { }
            }

#9


for(.........)
{
    try
    {
        ......
    }
    catch
    {
        continue;
    }
}

#10


不是阿,你们用这个当然没问题,你们如果是win7, 试试获取c盘根目录的文件夹,当我遍历到system volume …那个文件夹,然后再继续取得该文件夹下的子文件夹,就出现错误,遍历停止。
你们实验要用我这种方法才知道是否会停止遍历。

#11


我试试 我是Win 7我现在遍历C文件夹

#12


把所有文件都显示,然后会看到某些文件夹有一个锁的图标,其中有某些是拒绝访问的,当取得那文件夹后,想要取得该文件夹下的子文件夹,就出错停止遍历。你们可以试试。

#13


我遍历 
C:\\System Volume Information
没错 
。。。都可以访问

#14


应该可以获取文件夹的属性的吧?!
判断一下是否是拒绝访问的,是就continue,不是就进入 。
我只是提供个思路,没怎么用过这个,⊙﹏⊙‖∣

#15


试试用getaccesscontrol先判断一下能不能访问

#16


访问没出错,你试试用dir.getdirectory()试试。

#17


GetDirectory()?
你把代码贴出来算了

#18



            DirectoryInfo Di = new DirectoryInfo("c:\\");
            try
            {
                foreach (FileInfo item in Di.GetFiles("*.*", SearchOption.AllDirectories))
                {
                    Console.WriteLine(item.FullName);
                }
            }
            catch (Exception Ex)
            { 
                MessageBox.Show(Ex.Message);
            }


我也想得到答案,关注!
15楼的使用 getaccesscontrol 也许能解决问题,但不会编码。

#19


你那里写错了,应该。

#20


引用 18 楼 spmzfz 的回复:
C# code

            DirectoryInfo Di = new DirectoryInfo("c:\\");
            try
            {
                foreach (FileInfo item in Di.GetFiles("*.*", SearchOption.AllDirectories))
          ……

 


            foreach (string d in GetAuthorizedDirectories("C:\\"))
            {
                 
                foreach (string d2 in GetAuthorizedDirectories(d))
                {
                    Response.Write(d2);
                }
            }

             public static string[] GetChildrenFiles(string path)
        {
            try
            {
                return Directory.GetDirectories(path);
            }
            catch 
            {
                return new string[0];
            }
        }

#21


引用 9 楼 ck11926375 的回复:
for(.........)
{
  try
  {
  ......
  }
  catch
  {
  continue;
  }
}



这个貌似对的

#22


引用 20 楼 ray_yang 的回复:
引用 18 楼 spmzfz 的回复:

C# code

DirectoryInfo Di = new DirectoryInfo("c:\\");
try
...


应该谢谢   Ray_Yang ,不过他写错了一个单词。
http://social.msdn.microsoft.com/Forums/de-DE/2212/thread/478d6fd5-8898-4c46-8c92-8ee0253c596c

#23


是啊写错了 那不是楼主发的帖子吗,

#24


我不是楼主,我帮楼主顶,我也想知道答案:

http://topic.csdn.net/u/20091001/18/df483f2e-2018-4376-ad9c-581a6d136750.html?89346

#25


catch 掉

哇 楼已经很高了

#26


我只路过~!

#27


1.用catch确实不行。
2.22楼帖的那个就是我在msdn社区里问的帖子,但是我按照他的写法来写,还是不行。
3.因为我的代码和9楼的模式不一样,所以并不能用continue

我贴上我的代码:



private void getdirs(string initialCatalog)
        {
            //当前路径
            DirectoryInfo root = new DirectoryInfo(initialCatalog);
            //取得当前文件夹名字,和关键字作对比。
            string dirName = root.Name;
            if (searchTag(dirName, textBoxTag.Text))
                listBoxResult.Items.Add(root.FullName);

            //取得当前文件夹下所有文件,和关键字作对比。
            FileInfo[] files = root.GetFiles();
            foreach (FileInfo file in files)
            {
                string fileName = "";
                if (file.Name.IndexOf('.') != -1)
                {
                    fileName = file.Name.Substring(0, file.Name.LastIndexOf('.'));
                }
                else fileName = file.Name;

                if (searchTag(fileName, textBoxTag.Text)) listBoxResult.Items.Add(file.FullName);
            }

            //取得当前文件夹下所有文件夹,并用递归继续遍历所有子文件夹。
            DirectoryInfo[] dirs = null;
            try
            {
                dirs = root.GetDirectories();
            }
            catch (UnauthorizedAccessException x) { MessageBox.Show(x.Message); }
            try
            {
                if (dirs != null)
                {
                    foreach (DirectoryInfo d in dirs)
                    {
                        getdirs(d.FullName);
                    }
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); listBoxResult.Items.Add("-----------------------错误----------------------------"); }
        }



大家可以看下,这是我的截图:

这是当访问到该文件夹时的提示:
[img=http://b36.photo.store.qq.com/http_imgload.cgi?/rurl4_b=f03f05a824bf754f05aee22b90c6faaaa337ad046521984a6b87f1233a00a6cc89a401e74d8e2e0df3806715f269eda067478f504a7a7923391e89f4e06336e522f3427ef2d9e7ef10bb06aeeba0380ba90e659b&a=42&b=36][/img]


我是用listbox查看已经扫描到的文件夹,然后作为item添加到listbox。
可以看到,捕捉到catch语句后,没有继续执行了。
这个最下面那行是catch代码里面加的。说明后边没有再执行了。
[img=http://b42.photo.store.qq.com/http_imgload.cgi?/rurl4_b=f03f05a824bf754f05aee22b90c6faaa44764fa419d9901f42cee7d2bc083451dc0486969bf1dc6fd47e92f94e3baae6198a90bd8c9b20dd4aa587420fb494c18ce9109985f883cdadb3cfb2fb2033f06d2472c2&a=41&b=42][/img]

#28


重新贴上图片:


遍历文件夹时怎么跳过拒绝访问的文件夹



遍历文件夹时怎么跳过拒绝访问的文件夹

#29


你到24楼里的进去看看,使用的是递归,好像能跳过错误 。。。

#30


24楼的都看过了。我也是用递归,不能跳过错误。很奇怪,扫描到拒绝访问的文件夹就会自动停止执行下边的代码,就算用try...catch...也一样。

我参考了msdn的MVP专家,用了另外一种比较不成方法的方法,问题可以解决,但是期待更好的方法出现:



        private void getdirs(string initialCatalog)
        {
            //当前路径
            DirectoryInfo root = new DirectoryInfo(initialCatalog);
            //取得当前文件夹名字,和关键字作对比。
            string dirName = root.Name;
            if (searchTag(dirName, textBoxTag.Text))
                listBoxResult.Items.Add(root.FullName);

            //取得当前文件夹下所有文件,和关键字作对比。
/*主要就是改了这里,当不能获取下一级的文件时,置files为Null,使他不继续向下遍历*/
            FileInfo[] files;
            try
            {
                 files= root.GetFiles();
            }
            catch { files = null; }
            if (files != null)
            {
                foreach (FileInfo file in files)
                {
                    string fileName = "";
                    if (file.Name.IndexOf('.') != -1)
                    {
                        fileName = file.Name.Substring(0, file.Name.LastIndexOf('.'));
                    }
                    else fileName = file.Name;

                    if (searchTag(fileName, textBoxTag.Text)) listBoxResult.Items.Add(file.FullName);
                }
            }

            //取得当前文件夹下所有文件夹,并用递归继续遍历所有子文件夹。
/*主要就是改了这里,当不能获取下一级的文件夹时,置dirs为Null,使他不继续向下遍历*/
            DirectoryInfo[] dirs = null;
            try
            {
                dirs = root.GetDirectories();
            }
            catch { dirs = null; }
            try
            {
                if (dirs != null)
                {
                    foreach (DirectoryInfo d in dirs)
                    {
                        getdirs(d.FullName);
                    }
                }
            }
            catch { listBoxResult.Items.Add("-----------------------错误----------------------------"); }
        }


#31


用for不要用foreach就可以了。

for可以解决问题。很久之前也出现过这样的问题。

#32


引用 31 楼 zanfeng 的回复:
用for不要用foreach就可以了。

for可以解决问题。很久之前也出现过这样的问题。


是在catch里面用continue解决的吗?

#33


有项目管理经验的.NET开发的朋友,加上限500人的QQ群28720769,一起交流。

#34


我总感觉有点“当不能获取下一级的文件夹时,置dirs为Null,使他不继续向下遍历”时,你把问题复杂化了。

        private void GetDir(string TempDirStr)
        {
            DirectoryInfo Di = new DirectoryInfo(TempDirStr );
            DirectoryInfo[] DIS = Di.GetDirectories();

            for (int i = 0; i < DIS.Length   ; i++)
            {
                try
                {
                    Console.WriteLine(DIS[i].FullName);
                    GetDir(DIS[i].FullName);
                }
                catch (Exception Ex)
                {
                    Console.WriteLine("WrongMsg: {0}", Ex.Message);
                    //continue;  //continue语句在这里好像不起作用。
                }
            }
        }



      private void button8_Click(object sender, EventArgs e)
        {
            GetDir(@"C:\Documents and Settings\All Users");
        }

#35



                dir = dirs.Dequeue();                           // 取一目录名   
                try  
                {   
                    string[] fs = Directory.GetFiles(dir);      // 获取该目录下的所有文件   
                    foreach (string f in fs)   
                    {   
                        while (pause || bw.CancellationPending) // 处理暂停及取消操作   
                        {   
                            if (bw.CancellationPending) return; // 用户取消   
                            Thread.Sleep(20);   
                        }   
                        bw.ReportProgress(1, f);                // 报告当前进度   
                        Thread.Sleep(interval);                 // 避免快速连续引发事件   
                    }   
                    fs = Directory.GetDirectories(dir);         // 获取目录下的所有子目录   
                    foreach (string d in fs)   
                    {   
                        dirs.Enqueue(d);                        // 各子目录入队   
                    }   
                }   
                catch                                           // 目录或文件无操作权限等   
                {   
                    continue;   
                }   


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sxldfang/archive/2010/04/25/5527456.aspx

#36


引用 32 楼 zexin1000 的回复:
引用 31 楼 zanfeng 的回复:
用for不要用foreach就可以了。

for可以解决问题。很久之前也出现过这样的问题。


是在catch里面用continue解决的吗?


这样只会抛异常啊!

#37


引用 32 楼 zexin1000 的回复:
引用 31 楼 zanfeng 的回复:
用for不要用foreach就可以了。

for可以解决问题。很久之前也出现过这样的问题。


是在catch里面用continue解决的吗?


好像使用for foreach 都一样,不需用 continue.
        private void GetDir(string TempDirStr)
        {
            DirectoryInfo Di = new DirectoryInfo(TempDirStr );
            DirectoryInfo[] DIS = Di.GetDirectories();

            foreach (DirectoryInfo  item in DIS )
            {
                try
                {
                    Console.WriteLine(item.FullName);
                    GetDir(item.FullName);
                }
                catch (Exception Ex)
                {
                    Console.WriteLine("WrongMsg: {0}", Ex.Message);
                }
            }
        }

我头有点晕了,有时间再来研究。

#38


如果不设置不能访问的为null,便不能跳过那些拒绝访问的文件夹,纯粹是遍历了。

#39


之前也碰到过这样的问题,帮顶。。。

#40


虽然是老贴了,但是碰到了就说一下.
本来我也很纠结这个弹错的.
但是貌似经过实验对比,并没有中断,完好的遍历了所需所有文件.
try了这里

        private void ProcessDirectory(string targetDirectory)
        {
            //检测3种文件
            try
            {
                string[] fileEntries1 = System.IO.Directory.GetFiles(@targetDirectory, "*.txt");
                string[] fileEntries2 = System.IO.Directory.GetFiles(@targetDirectory, "*.lrc");
                string[] fileEntries3 = System.IO.Directory.GetFiles(@targetDirectory, "*.krc");

                foreach (string fileName in fileEntries1)
                    ProcessFile(fileName);
                foreach (string fileName in fileEntries2)
                    ProcessFile(fileName);
                foreach (string fileName in fileEntries3)
                    ProcessFile(fileName);

                //检测子文件夹
                string[] subdirectoryEntries = System.IO.Directory.GetDirectories(@targetDirectory);
                foreach (string subdirectory in subdirectoryEntries)
                    ProcessDirectory(subdirectory);   //递归调用
            }
            catch { }
        }