Chase Rocker
Chase Rocker

Reputation: 1908

Exclude files from Directory.EnumerateFiles based on multiple criteria

Is there a way to exclude files from Directory.EnumerateFiles based on multiple criteria?

The filtering based on extension works fine. But I also want to filter out any filenames which contain any of the exclusion strings. I'm not sure how to do it. I know I could iterate thru the fileArray and check each filename, but that would probably be a performance hit...I'm guessing, right?

This is example code which only uses the first exclusion thumb as a filter. Now I need to use all elements of the exclusion string array. Also, the string used in exclusion is dynamic, it won't necessarily have just the 3 filter criteria. This is just an example.

        Dim ext() As String = Split(".jpg;.gif;.bmp;.tif;.png;.tiff;.jpeg", ";")
        Dim exclusion() As String = Split("thumb,nothing,empty", ",")

        Dim fileArray = From chkFile In Directory.EnumerateFiles(fpath, "*.*", SearchOption.TopDirectoryOnly)
                       Where ext.Contains(Path.GetExtension(chkFile).ToLower(System.Globalization.CultureInfo.InvariantCulture)) _
                        And Not Path.GetFileNameWithoutExtension(chkFile).ToLower(System.Globalization.CultureInfo.InvariantCulture).Contains(exclusion(0).Trim.ToLower)

Upvotes: 0

Views: 1039

Answers (1)

tinstaafl
tinstaafl

Reputation: 6948

Here's one way that uses FileInfo objects instead of strings. This eliminates all those Path calls, but should be easy to change if desired.

Dim ext() As String = {".jpg", ".gif", ".bmp", ".tif", ".png", ".tiff", ".jpeg"}
Dim exclusion() As String = {"thumb", "nothing", "empty"}
Dim fileArray = From chkFile As FileInfo In New DirectoryInfo(fpath).EnumerateFiles("*.*", SearchOption.TopDirectoryOnly)
                Where ext.Contains(chkFile.Extension.ToLower(System.Globalization.CultureInfo.InvariantCulture)) _
                And Not exclusion.Any(Function(x) chkFile.Name.ToLower(System.Globalization.CultureInfo.InvariantCulture).Contains(x))
                Select chkFile

Upvotes: 3

Related Questions