none
VC#2010枚举根目录下的文件失败 RRS feed

  • 问题

  • 各位好:

    我有一个问题想请教一下。我想用Directory.EnumerateFiles()这个方法枚举根目录下的文件,可是因为根目录下存在无法访问的文件夹(比如System Volume Information文件夹)而失败,就如何解决。我用的是VC#2010在windows 7 64位旗舰版,部分代码如下:

     DriveInfo[] drinfo = DriveInfo.GetDrives();
                for (int i = 0; i < drinfo.Length;i++ )
                {
                    //label1.Text += "\r\n" + drinfo[i].ToString();
                    if (!(drinfo[i].ToString() == @"A:\" | drinfo[i].ToString() == @"B:\" | drinfo[i].ToString() == @"C:\" | drinfo[i].ToString() == @"D:\" | drinfo[i].ToString() == @"E:\"))
                    {
                        string strDirectory = drinfo[i].ToString();
                      var strFilenames=from filename in   Directory.EnumerateFiles(@strDirectory,"*.*", SearchOption.AllDirectories)select filename  ;
                      foreach (var file in strFilenames)
                      {
                          FileInfo fileInformation = new FileInfo(@file);
                          if (fileInformation.Attributes == FileAttributes.Archive)
                          {
                              label1.Text += "\r\n" + file;
                          }
                      }
                    }
                }

    肯请赐教。谢谢!


    VC# ASP.NET
    • 已移动 Sheng Jiang 蒋晟Moderator 2010年12月3日 20:08 (发件人:Visual Studio 相关讨论(Visual Studio 2010以前版本))
    2010年12月3日 12:26

答案

  • 不用SearchOption.AllDirectories。用递归。访问一个目录的子目录之前,先检查目录属性。

    另外,就算你跳过隐藏和系统目录,仍旧有可能有文件无法访问,如果你不想想这样出现一长就不能继续,那么要把你的异常处理代码放在循环里面。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    • 已标记为答案 高居臣 2010年12月4日 3:17
    2010年12月4日 0:43
    版主

全部回复

  • 略过隐藏和系统文件。另外,在循环里面加异常处理

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年12月3日 20:08
    版主
  • 非常感谢您能回答我的问题。

    如何略过隐藏和系统文件?好象Directory.EnumerateFiles()这个方法没有相应参数。我在系统的“文件夹选项”中设置了“不显示隐藏的系统.......”等相应选项,可是还是不行。如果加异常处理的话,该方法调不能继续,也就无法继续枚举,无法完成相应的功能。期待您详细的解释。谢谢!


    VC# ASP.NET
    2010年12月3日 23:50
  • 不用SearchOption.AllDirectories。用递归。访问一个目录的子目录之前,先检查目录属性。

    另外,就算你跳过隐藏和系统目录,仍旧有可能有文件无法访问,如果你不想想这样出现一长就不能继续,那么要把你的异常处理代码放在循环里面。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    • 已标记为答案 高居臣 2010年12月4日 3:17
    2010年12月4日 0:43
    版主
  • 非常感谢您的回答。谢谢!


    VC# ASP.NET
    2010年12月4日 3:18