using MediaBrowser.Controller.Library; using MediaBrowser.Model.Logging; using System; using System.Collections.Generic; using System.IO; using System.Linq; 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) .Where(i => !i.Attributes.HasFlag(FileAttributes.System) && !i.Name.Equals(".") && !i.Name.Equals("..")); foreach (var entry in entries) { var isDirectory = entry.Attributes.HasFlag(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 shortuct: " + entry.FullName); continue; } var data = FileSystem.GetFileSystemInfo(newPath); if (data.Exists) { // Find out if the shortcut is pointing to a directory or file if (data.Attributes.HasFlag(FileAttributes.Directory)) { // 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; } } }