C#使用Directory.GetFiles和搜索模式递归目录

时间:2011-04-01 10:19:23

标签: c# recursion

我想使用递归查找目录结构中的所有excel文件。问题是,Directory.GetFiles中使用的搜索模式一次只允许一个扩展。

有没有人知道解决这个问题的方法,还是我必须多次通过目录来寻找特定的扩展?或者你可以只抓取每个文件,然后遍历该列表寻找特定的扩展名。无论哪种方式听起来都有点低效。

由于

6 个答案:

答案 0 :(得分:5)

在.NET中,每个版本都有SearchOption.TopDirectoryOnly和SearchOption.AllDirectories

在.NET 4中,你可以非常有效地做例如:

        var regex = new Regex(@"\d+", RegexOptions.Compiled);

        var files = new DirectoryInfo(topdir)

            .EnumerateFiles("*.*", SearchOption.AllDirectories)

            .Where(fi => regex.IsMatch(fi.Name));

(此示例过滤名称中包含两位数字的文件)

要模拟它,编写一个递归枚举器方法(yield return)来返回所有文件,并按如下方式过滤结果:

 IEnumerable<FileInfo> Recurse(string topdir)
 { 
      // for each GetFiles() array element
      //      if is_not_dir yield return
      //      else Recurse(subdir)          
 }

 var filtered = Recurse.Where(fi => regex.IsMatch(fi.Name));

HTH

答案 1 :(得分:0)

修改递归循环并获得模式列表。例如

static private void walk(String name)
{
    try
    {
        foreach (String pattern in Patterns)
        {
            foreach (String f in Directory.GetFiles(name, pattern))
            {
                Console.WriteLine(f);
             } 
        }
            foreach (String d in Directory.GetDirectories(name))
        {
            walk(d);
        }
    }
    catch
    {

    }

}

答案 2 :(得分:0)

答案 3 :(得分:0)

如果您只想获取所有Excel文件,请使用“ .xl ”模式。

否则我建议不用模式调用Directory.GetFiles并手动过滤匹配的扩展名。

答案 4 :(得分:0)

要遍历目录和子目录,无论子文件夹或文件有多少,您可以将文件放入数组中。 您可以在扩展部分中指定类型文件,Jpeg,Excel,Msword。

string [] Excel_Files;
String path = "what ever is your path";

Files=  Directory.GetFiles(Path, "*.XL", SearchOption.AllDirectories).Select(x => Path.GetFileName(x)).ToArray();

或要为不同的文件扩展名指定多个搜索选项,您可以这样做:

public string[] getFiles(string SourceFolder, string Filter, 
 System.IO.SearchOption searchOption)
{

ArrayList alFiles = new ArrayList();

 string[] MultipleFilters = Filter.Split('|');

 foreach (string FileFilter in MultipleFilters)
 {
       alFiles.AddRange(Directory.GetFiles(SourceFolder, FileFilter, searchOption));
 }

 return (string[])alFiles.ToArray(typeof(string));
}

public void button_click()
{

string[] sFiles = getFiles(Server.MapPath("~/"), 
 "*.gif|*.jpg|*.png|*.bmp|*.XL|*.PNG", 
 SearchOption.AllDirectories);

foreach (string FileName in sFiles)
{
 Response.Write(FileName + "<br />");
}
}

答案 5 :(得分:0)

我认为第二种选择更有效率。使用以下模式遍历每个文件: .xl ,然后缩小列表以查找特定结尾。

类似的东西:

foreach (String f in Directory.GetFiles(path, "*.xl*", SearchOption.AllDirectories))
{
    if (HasSomeExcelExtension(f))
        files .Add(f);
}

您可以使用EndsWith方法检查每个扩展名的“f”,或使用Path.GetExtension方法提取扩展名,并在包含所需扩展名的哈希表中查找。

只是我的$ .02 HTH