Can you call Directory.GetFiles() with multiple filters?
For .NET 4.0 and later,
var files = Directory.EnumerateFiles("C:\\path", "*.*", SearchOption.AllDirectories)
.Where(s => s.EndsWith(".mp3") || s.EndsWith(".jpg"));
For earlier versions of .NET,
var files = Directory.GetFiles("C:\\path", "*.*", SearchOption.AllDirectories)
.Where(s => s.EndsWith(".mp3") || s.EndsWith(".jpg"));
edit: Please read the comments. The improvement that Paul Farry suggests, and the memory/performance issue that Christian.K points out are both very important.
Multiple file-extensions searchPattern for System.IO.Directory.GetFiles
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));
}
How can Directory.Getfiles() multi searchpattern filters c#
You could use something like this
string[] extensions = { "jpg", "txt", "asp", "css", "cs", "xml" };
string[] dizin = Directory.GetFiles(@"c:\s\sent", "*.*")
.Where(f => extensions.Contains(f.Split('.').Last().ToLower())).ToArray();
Or use FileInfo.Extension
bit safer than String.Split
but may be slower
string[] extensions = { ".jpg", ".txt", ".asp", ".css", ".cs", ".xml" };
string[] dizin = Directory.GetFiles(@"c:\s\sent", "*.*")
.Where(f => extensions.Contains(new FileInfo(f).Extension.ToLower())).ToArray();
Or as juharr mentioned you can also use System.IO.Path.GetExtension
string[] extensions = { ".jpg", ".txt", ".asp", ".css", ".cs", ".xml" };
string[] dizin = Directory.GetFiles(@"c:\s\sent", "*.*")
.Where(f => extensions.Contains(System.IO.Path.GetExtension(f).ToLower())).ToArray();
Multiple filters with Directory.GetFiles?
The Directory.GetFiles function doesn't support multiple filters. My solution:
string patter = "*.jpg|*.png|*.gif";
string[] filters = patter.Split('|');
foreach(string filter in filters )
{
// call Directory.GetFiles(path, filter) here;
}
GetFiles with multiple extensions
Why not create an extension method? That's more readable.
public static IEnumerable<FileInfo> GetFilesByExtensions(this DirectoryInfo dir, params string[] extensions)
{
if (extensions == null)
throw new ArgumentNullException("extensions");
IEnumerable<FileInfo> files = Enumerable.Empty<FileInfo>();
foreach(string ext in extensions)
{
files = files.Concat(dir.GetFiles(ext));
}
return files;
}
EDIT: a more efficient version:
public static IEnumerable<FileInfo> GetFilesByExtensions(this DirectoryInfo dir, params string[] extensions)
{
if (extensions == null)
throw new ArgumentNullException("extensions");
IEnumerable<FileInfo> files = dir.EnumerateFiles();
return files.Where(f => extensions.Contains(f.Extension));
}
Usage:
DirectoryInfo dInfo = new DirectoryInfo(@"c:\MyDir");
dInfo.GetFilesByExtensions(".jpg",".exe",".gif");
Directory.GetFiles with multiple filters, collect one string array
try :
string sourceDir = "C:\\Users\\ozkan\\Desktop\\foto\\"
string[] picList;
string pattern = "*.jpg|*.png|*.gif";
string[] filters = pattern.Split('|');
picList = filters .SelectMany(f=> Directory.GetFiles(sourceDir , f)).ToArray();
Related Topics
How to Convert HTML to Plain Text
What Is a Nullreferenceexception, and How to Fix It
How to Update the Gui from Another Thread
How to Convert a Byte Array to a Hexadecimal String, and Vice Versa
Serialize and Deserialize Json and Json Array in Unity
Deserialize Json into C# Dynamic Object
Difference Between a Field and a Property
Processstartinfo Hanging on "Waitforexit" - Why
Any Difference Between "Await Task.Run(); Return;" and "Return Task.Run()"
There Is Already an Open Datareader Associated With This Command Which Must Be Closed First
Watermark/Hint/Placeholder Text in Textbox