【问题标题】:How to search all directories in all drives for .txt files?如何在所有驱动器中的所有目录中搜索 .txt 文件?
【发布时间】:2013-07-12 10:44:27
【问题描述】:

我正在使用此代码搜索所有驱动器中的所有目录以搜索所有 .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;
}

但是在运行时我遇到了这个错误:

如何解决?

谢谢。

【问题讨论】:

  • 将错误信息写成文本。人们可能看不到图像(例如,我)。
  • @wudzik 使用try-catch它不会找到任何文件。因为面对上述arror中的目录时它会忽略所有其他目录。
  • @SonerGönül 对路径“C:\$Recycle.Bin\S-1-5-21-2163108302-3039877246-2377335864-500”的访问被拒绝。
  • stackoverflow.com/questions/17570629/… 检查我的解决方案,我在访问文件时遇到了同样的问题。
  • @bbb 不,它会在您可以访问的目录中找到

标签: c#


【解决方案1】:

这只是一个权限问题。使用 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 中提供了该方法的一个很好的示例。

【讨论】:

  • 我做到了,但我看到如果它忽略了带有第一个错误的目录的整个驱动器。我想我需要先检查目录可访问性,然后在那里搜索,但我不知道该怎么做那个。
  • @bbb:请参阅我对 Slartibartfast 答案的评论。
  • @dotNET - Slartibartfast 删除了他的答案并返回马格拉西设计更多峡湾。
  • @Corak:哎哟。你是一个见多识广的人:)。无论如何,我在上面添加了正确的示例代码。
  • @DotNEt 感谢您的更正,当我写那个答案时,我正在使用一个控制不佳的手机,认为最好删除它,这个答案是正确的。 -Corak 哈哈,你抓住了我
【解决方案2】:

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

请检查:

unauthorizedaccessexception-cannot-resolve-directory-getfiles-failure

【讨论】:

  • 我对这些参数有点困惑。首先是字符串路径参数;我想搜索所有目录而不是一个特定的目录。还有 IList 文件;这到底是什么?你能解释一下吗?
  • 首先您只获得所有目录路径,然后为每个目录路径调用 AddFiles() 方法,该方法会将文件添加到全局数组中。如果您无法读取该文件,那么您将捕获异常并且不要添加此文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
  • 2023-04-10
  • 2019-11-17
  • 2016-11-29
  • 2015-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多