19

我需要在驱动器(C:、D: 等)中搜索特定文件类型(扩展名如 .xml、.csv、.xls)。如何执行递归搜索以循环所有目录和内部目录并返回文件所在位置的完整路径?或者我在哪里可以获得这方面的信息?

VB.NET 或 C#

谢谢

编辑〜我遇到了一些错误,比如无法访问系统卷访问被拒绝等。有谁知道我在哪里可以看到一些关于实现文件搜索的代码?我只需要搜索选定的驱动器并返回找到的所有文件的文件类型的完整路径。

4

3 回答 3

54
System.IO.Directory.GetFiles(@"c:\", "*.xml", SearchOption.AllDirectories);
于 2009-01-13T01:54:28.200 回答
21

这个怎么样?它避免了内置递归搜索经常抛出的异常(即,您对单个文件夹的访问被拒绝,并且您的整个搜索都死了),并且被延迟评估(即,它一找到结果就返回结果,而不是缓冲 2000 个结果)。惰性行为使您可以构建响应式 UI 等,并且还可以与 LINQ(尤其是First(),Take()等)很好地配合使用。

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
static class Program { // formatted for vertical space
    static void Main() {
        foreach (string match in Search("c:\\", "*.xml")) {
            Console.WriteLine(match);
        }
    }
    static IEnumerable<string> Search(string root, string searchPattern) {
        Queue<string> dirs = new Queue<string>();
        dirs.Enqueue(root);
        while (dirs.Count > 0) {
            string dir = dirs.Dequeue();

            // files
            string[] paths = null;
            try {
                paths = Directory.GetFiles(dir, searchPattern);
            } catch { } // swallow

            if (paths != null && paths.Length > 0) {
                foreach (string file in paths) {
                    yield return file;
                }
            }

            // sub-directories
            paths = null;
            try {
                paths = Directory.GetDirectories(dir);
            } catch { } // swallow

            if (paths != null && paths.Length > 0) {
                foreach (string subDir in paths) {
                    dirs.Enqueue(subDir);
                }
            }
        }
    }
}
于 2009-01-13T08:25:00.317 回答
5

看起来recls库(代表递归ls)现在有一个纯 .NET 实现。我刚刚在 Dobb 博士的文章中读到过

将用作:

using Recls;
using System;
static class Program { // formatted for vertical space
    static void Main() {
        foreach(IEntry e in FileSearcher.Search(@"c:\", "*.xml|*.csv|*.xls")) {
            Console.WriteLine(e.Path);
        }
    }
于 2009-11-19T23:40:33.820 回答