/// <summary> /// A recursive method, which traverse parent directory, and any first level sub directories it meets. /// </summary> private void AddDirectoryContent(ICollection <FileEntry> parent, string directory) { var ignoredFiles = new List <string> { "desktop", "thumbs", "movies", "series", "sample" }; foreach (var entry in Directory.GetFileSystemEntries(directory)) { try { var fileName = Path.GetFileName(entry); if (fileName == null) { continue; } var isDirectory = Directory.Exists(entry); var isDirectoryAndContainsCorrectFileTypes = false; const int fileExtensionLength = 4; var isCorrectFileType = ExpectedNames.FileTypeNames.Contains(fileName.Substring(fileName.Length - fileExtensionLength)); if (isDirectory) { //Check if folder already contains a subtitle: if (Properties.SubSearchSettings.Default.IgnoreSubbedFolders) { var subtitleExist = LookForSubtitle(entry); if (subtitleExist) { continue; } } //Check if correct file type is present in first level of dir: var dirEntries = Directory.GetFiles(entry); foreach (var dirEntry in dirEntries) { if (ExpectedNames.FileTypeNames.Contains(Path.GetExtension(dirEntry)) == false) { //Content in directory is not a file type we look for. continue; } if (isCorrectFileType) { isDirectoryAndContainsCorrectFileTypes = true; } isCorrectFileType = true; } } var matchesIgnoredFile = ignoredFiles.Contains(fileName.ToLower().Split('.')[0]); if (matchesIgnoredFile || !isCorrectFileType) { continue; } var fileEntry = new FileEntry(entry); fileEntry.DefineEntriesFromPath(); if (isDirectoryAndContainsCorrectFileTypes) { //Add contents within directory (recursive call). this.AddDirectoryContent(fileEntry.AllEntries, fileEntry.Path); } DispatcherHelper.CheckBeginInvokeOnUI(() => { parent.Add(fileEntry); }); } catch (Exception) { //ignored and continue with next (meaning that this entry will not be shown.) } } }