using MediaBrowser.Controller.Library; using MediaBrowser.Model.Logging; using System; using System.Collections.Generic; using System.IO; namespace MediaBrowser.Controller.IO { /// /// Provides low level File access that is much faster than the File/Directory api's /// public static class FileData { /// /// Gets the filtered file system entries. /// /// The path. /// The logger. /// The search pattern. /// The flatten folder depth. /// if set to true [resolve shortcuts]. /// The args. /// Dictionary{System.StringFileSystemInfo}. /// path public static Dictionary GetFilteredFileSystemEntries(string path, ILogger logger, string searchPattern = "*", int flattenFolderDepth = 0, bool resolveShortcuts = true, ItemResolveArgs args = null) { if (string.IsNullOrEmpty(path)) { throw new ArgumentNullException("path"); } var dict = new Dictionary(StringComparer.OrdinalIgnoreCase); var entries = new DirectoryInfo(path).EnumerateFileSystemInfos(searchPattern, SearchOption.TopDirectoryOnly); foreach (var entry in entries) { var isDirectory = (entry.Attributes & FileAttributes.Directory) == FileAttributes.Directory; if (resolveShortcuts && FileSystem.IsShortcut(entry.FullName)) { var newPath = FileSystem.ResolveShortcut(entry.FullName); if (string.IsNullOrWhiteSpace(newPath)) { //invalid shortcut - could be old or target could just be unavailable logger.Warn("Encountered invalid shortcut: " + entry.FullName); continue; } // Don't check if it exists here because that could return false for network shares. var data = new DirectoryInfo(newPath); // add to our physical locations if (args != null) { args.AddAdditionalLocation(newPath); } dict[data.FullName] = data; } else if (flattenFolderDepth > 0 && isDirectory) { foreach (var child in GetFilteredFileSystemEntries(entry.FullName, logger, flattenFolderDepth: flattenFolderDepth - 1, resolveShortcuts: resolveShortcuts)) { dict[child.Key] = child.Value; } } else { dict[entry.FullName] = entry; } } return dict; } } }