繁体   English   中英

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

[英]C# Recurse Directories using Directory.GetFiles and search pattern

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

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

谢谢

在.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

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

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
    {

    }

}

在.NET 4中,有一个额外的重载,允许包含子文件夹

编辑 oops我没有很好地阅读这个问题......

看看这里

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

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

要遍历目录和子目录,无论子文件夹或文件有多少,您可以将文件放入数组中。 您可以在扩展部分中指定类型文件,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 />");
}
}

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

就像是:

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

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

只是我的$ .02小时

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM