Multiple file-extensions searchPattern for System.IO.Directory.GetFiles

前端 未结 20 2326
名媛妹妹
名媛妹妹 2020-11-27 11:08

What is the syntax for setting multiple file-extensions as searchPattern on Directory.GetFiles()? For example filtering out files

相关标签:
20条回答
  • 2020-11-27 11:33

    GetFiles can only match a single pattern, but you can use Linq to invoke GetFiles with multiple patterns:

    FileInfo[] fi = new string[]{"*.txt","*.doc"}
        .SelectMany(i => di.GetFiles(i, SearchOption.AllDirectories))
        .ToArray();
    

    See comments section here: http://www.codeproject.com/KB/aspnet/NET_DirectoryInfo.aspx

    0 讨论(0)
  • 2020-11-27 11:33

    I would use the following:

    var ext = new string[] { ".ASPX", ".ASCX" };
    FileInfo[] collection = (from fi in new DirectoryInfo(path).GetFiles()
                             where ext.Contains(fi.Extension.ToUpper())
                             select fi)
                             .ToArray();
    

    EDIT: corrected due mismatch between Directory and DirectoryInfo

    0 讨论(0)
  • 2020-11-27 11:34

    look like this demo:

    void Main()
    {
        foreach(var f in GetFilesToProcess("c:\\", new[] {".xml", ".txt"}))
            Debug.WriteLine(f);
    }
    private static IEnumerable<string> GetFilesToProcess(string path, IEnumerable<string> extensions)
    {
       return Directory.GetFiles(path, "*.*")
           .Where(f => extensions.Contains(Path.GetExtension(f).ToLower()));
    }
    
    0 讨论(0)
  • 2020-11-27 11:34

    I did a simple way for seach as many extensions as you need, and with no ToLower(), RegEx, foreach...

    List<String> myExtensions = new List<String>() { ".aspx", ".ascx", ".cs" }; // You can add as many extensions as you want.
    DirectoryInfo myFolder = new DirectoryInfo(@"C:\FolderFoo");
    SearchOption option = SearchOption.TopDirectoryOnly; // Use SearchOption.AllDirectories for seach in all subfolders.
    List<FileInfo> myFiles = myFolder.EnumerateFiles("*.*", option)
        .Where(file => myExtensions
        .Any(e => String.Compare(file.Extension, e, CultureInfo.CurrentCulture, CompareOptions.IgnoreCase) == 0))
        .ToList();
    

    Working on .Net Standard 2.0.

    0 讨论(0)
  • 2020-11-27 11:36

    You can do it like this

    new DirectoryInfo(path).GetFiles().Where(Current => Regex.IsMatch(Current.Extension, "\\.(aspx|ascx)", RegexOptions.IgnoreCase)
    
    0 讨论(0)
  • 2020-11-27 11:38

    I believe there is no "out of the box" solution, that's a limitation of the Directory.GetFiles method.

    It's fairly easy to write your own method though, here is an example.

    The code could be:

    /// <summary>
    /// Returns file names from given folder that comply to given filters
    /// </summary>
    /// <param name="SourceFolder">Folder with files to retrieve</param>
    /// <param name="Filter">Multiple file filters separated by | character</param>
    /// <param name="searchOption">File.IO.SearchOption, 
    /// could be AllDirectories or TopDirectoryOnly</param>
    /// <returns>Array of FileInfo objects that presents collection of file names that 
    /// meet given filter</returns>
    public string[] getFiles(string SourceFolder, string Filter, 
     System.IO.SearchOption searchOption)
    {
     // ArrayList will hold all file names
    ArrayList alFiles = new ArrayList();
    
     // Create an array of filter string
     string[] MultipleFilters = Filter.Split('|');
    
     // for each filter find mathing file names
     foreach (string FileFilter in MultipleFilters)
     {
      // add found file names to array list
      alFiles.AddRange(Directory.GetFiles(SourceFolder, FileFilter, searchOption));
     }
    
     // returns string array of relevant file names
     return (string[])alFiles.ToArray(typeof(string));
    }
    
    0 讨论(0)
提交回复
热议问题