Can you call Directory.GetFiles() with multiple filters?

前端 未结 26 2401
逝去的感伤
逝去的感伤 2020-11-22 05:25

I am trying to use the Directory.GetFiles() method to retrieve a list of files of multiple types, such as mp3\'s and jpg\'s. I have t

相关标签:
26条回答
  • 2020-11-22 05:59

    Using GetFiles search pattern for filtering the extension is not safe!! For instance you have two file Test1.xls and Test2.xlsx and you want to filter out xls file using search pattern *.xls, but GetFiles return both Test1.xls and Test2.xlsx I was not aware of this and got error in production environment when some temporary files suddenly was handled as right files. Search pattern was *.txt and temp files was named *.txt20181028_100753898 So search pattern can not be trusted, you have to add extra check on filenames as well.

    0 讨论(0)
  • 2020-11-22 06:04

    Nop... I believe you have to make as many calls as the file types you want.

    I would create a function myself taking an array on strings with the extensions I need and then iterate on that array making all the necessary calls. That function would return a generic list of the files matching the extensions I'd sent.

    Hope it helps.

    0 讨论(0)
  • 2020-11-22 06:05

    Let

    var set = new HashSet<string> { ".mp3", ".jpg" };
    

    Then

    Directory.GetFiles(path, "*.*", SearchOption.AllDirectories)
             .Where(f => set.Contains(
                 new FileInfo(f).Extension,
                 StringComparer.OrdinalIgnoreCase));
    

    or

    from file in Directory.GetFiles(path, "*.*", SearchOption.AllDirectories)
    from ext in set
    where String.Equals(ext, new FileInfo(file).Extension, StringComparison.OrdinalIgnoreCase)
    select file;
    
    0 讨论(0)
  • 2020-11-22 06:05
    DirectoryInfo directory = new DirectoryInfo(Server.MapPath("~/Contents/"));
    
    //Using Union
    
    FileInfo[] files = directory.GetFiles("*.xlsx")
                                .Union(directory
                                .GetFiles("*.csv"))
                                .ToArray();
    
    0 讨论(0)
  • 2020-11-22 06:07
    List<string> FileList = new List<string>();
    DirectoryInfo di = new DirectoryInfo("C:\\DirName");
    
    IEnumerable<FileInfo> fileList = di.GetFiles("*.*");
    
    //Create the query
    IEnumerable<FileInfo> fileQuery = from file in fileList
                                      where (file.Extension.ToLower() == ".jpg" || file.Extension.ToLower() == ".png")
                                      orderby file.LastWriteTime
                                      select file;
    
    foreach (System.IO.FileInfo fi in fileQuery)
    {
        fi.Attributes = FileAttributes.Normal;
        FileList.Add(fi.FullName);
    }
    
    0 讨论(0)
  • 2020-11-22 06:08

    Make the extensions you want one string i.e ".mp3.jpg.wma.wmf" and then check if each file contains the extension you want. This works with .net 2.0 as it does not use LINQ.

    string myExtensions=".jpg.mp3";
    
    string[] files=System.IO.Directory.GetFiles("C:\myfolder");
    
    foreach(string file in files)
    {
       if(myExtensions.ToLower().contains(System.IO.Path.GetExtension(s).ToLower()))
       {
          //this file has passed, do something with this file
    
       }
    }
    

    The advantage with this approach is you can add or remove extensions without editing the code i.e to add png images, just write myExtensions=".jpg.mp3.png".

    0 讨论(0)
提交回复
热议问题