Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Directory.GetFiles of certain extension

Is there a way to simplify this linq expression, or is there a better way of doing this?

Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories)          .Where(s => s.EndsWith(".jpg", StringComparison.OrdinalIgnoreCase) ||                      s.EndsWith(".gif", StringComparison.OrdinalIgnoreCase) ||                      s.EndsWith(".png", StringComparison.OrdinalIgnoreCase) ||                      ...); 

Basically I want to return all files of a certain extension. Unfortunately, this method isn't very flexible. I'd rather be able to add extensions to a list and have Directory.GetFiles return those extensions. Is that possible?

like image 454
XSL Avatar asked Nov 09 '12 02:11

XSL


People also ask

What is directory GetFiles?

GetFiles(String, String, SearchOption) Returns the names of files (including their paths) that match the specified search pattern in the specified directory, using a value to determine whether to search subdirectories.


2 Answers

If you would like to do your filtering in LINQ, you can do it like this:

var ext = new List<string> { "jpg", "gif", "png" }; var myFiles = Directory     .EnumerateFiles(dir, "*.*", SearchOption.AllDirectories)     .Where(s => ext.Contains(Path.GetExtension(s).TrimStart(".").ToLowerInvariant())); 

Now ext contains a list of allowed extensions; you can add or remove items from it as necessary for flexible filtering.

like image 195
Sergey Kalinichenko Avatar answered Oct 02 '22 17:10

Sergey Kalinichenko


Doesn't the Directory.GetFiles(String, String) overload already do that? You would just do Directory.GetFiles(dir, "*.jpg", SearchOption.AllDirectories)

If you want to put them in a list, then just replace the "*.jpg" with a variable that iterates over a list and aggregate the results into an overall result set. Much clearer than individually specifying them. =)

Something like...

foreach(String fileExtension in extensionList){     foreach(String file in Directory.GetFiles(dir, fileExtension, SearchOption.AllDirectories)){         allFiles.Add(file);     } } 

(If your directories are large, using EnumerateFiles instead of GetFiles can potentially be more efficient)

like image 20
Tyler Lee Avatar answered Oct 02 '22 18:10

Tyler Lee