簡體   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