2013-07-12 63 views
4

我使用这个代码搜索所有目录中的所有驱动器来搜索所有.txt文件:如何在所有驱动器中搜索.txt文件中的所有目录?

public List<string> Search() 
{ 
    var files = new List<string>(); 
    foreach (DriveInfo d in DriveInfo.GetDrives().Where(x => x.IsReady == true)) 
    { 
     files.AddRange(Directory.GetFiles(d.RootDirectory.FullName, "*.txt", SearchOption.AllDirectories)); 
    } 
    return files; 
} 

但在运行我有此错误: enter image description here

如何RESOLV呢?

谢谢。

+1

的try-catch和去 – wudzik

+0

写入错误消息的文本。人们可能看不到图像(例如,我)。 –

+1

@wudzik使用try-catch时,它不会找到任何文件。因为它在面对上述arror中的目录时会忽略所有其他目录。 – bbb

回答

7

这只是一个权限问题。使用try/catch块。您的磁盘上的某些文件夹(包括RecycleBin文件夹)无法访问无特权的代码。

public List<string> Search() 
{ 
    var files = new List<string>(); 
    foreach (DriveInfo d in DriveInfo.GetDrives().Where(x => x.IsReady)) 
    { 
     try 
     { 
      files.AddRange(Directory.GetFiles(d.RootDirectory.FullName, "*.txt", SearchOption.AllDirectories)); 
     } 
     catch(Exception e) 
     { 
      Logger.Log(e.Message); // Log it and move on 
     } 
    } 

    return files; 
} 

另外请注意,使用Directory.GetFilesAllDirectories选项有一个固有的问题,如果有任何在整个驱动器中的文件夹是无法访问它会失败,因此你不会得到任何文件在您的驱动器结果。解决方案是做手动递归。该方法的一个很好的例子可在this SO question中找到。

+0

我做到了,但我看到如果它忽略了带有第一个错误的目录的整个驱动器。我想我需要先检查目录可访问性,然后在那里搜索,但我不知道该怎么做。 – bbb

+0

@bbb:查看我对Slartibartfast的回答的评论。 – dotNET

+0

添加了正确使用try/catch的代码。 – dotNET

0

这里的问题是一些你无法控制的文件来访问它的文件。所以你需要使用try{ } catch{ }。但是我认为在处理整个文件系统目录时你无法处理这个问题。因此,您需要首先获取所有目录的列表,然后在处理特定目录文件时一次处理每个目录,以便处理这种异常。

请检查:

unauthorizedaccessexception-cannot-resolve-directory-getfiles-failure

+0

我有点困惑的论点。首先与字符串路径参数;我想搜索所有目录不是一个特定的one.And与IList 文件;这是什么确切的?你能请更多地解释我? – bbb

+0

首先你得到所有目录路径,然后为每个目录路径调用方法AddFiles(),它将文件添加到全局数组中。如果你不能读取文件,那么你就会发现异常,并且不要添加这个文件。 –

相关问题