From a86b71899ec52c44ddc6c3018e8cc5e9d7ff4d62 Mon Sep 17 00:00:00 2001 From: Andrew Rabert Date: Thu, 27 Dec 2018 18:27:57 -0500 Subject: Add GPL modules --- MediaBrowser.Controller/IO/FileData.cs | 123 +++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 MediaBrowser.Controller/IO/FileData.cs (limited to 'MediaBrowser.Controller/IO/FileData.cs') diff --git a/MediaBrowser.Controller/IO/FileData.cs b/MediaBrowser.Controller/IO/FileData.cs new file mode 100644 index 000000000..e1fabee4f --- /dev/null +++ b/MediaBrowser.Controller/IO/FileData.cs @@ -0,0 +1,123 @@ +using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Providers; +using MediaBrowser.Model.Logging; +using System; +using System.Collections.Generic; +using MediaBrowser.Model.IO; + +namespace MediaBrowser.Controller.IO +{ + /// + /// Provides low level File access that is much faster than the File/Directory api's + /// + public static class FileData + { + private static Dictionary GetFileSystemDictionary(FileSystemMetadata[] list) + { + var dict = new Dictionary(StringComparer.OrdinalIgnoreCase); + + foreach (var file in list) + { + dict[file.FullName] = file; + } + return dict; + } + + /// + /// Gets the filtered file system entries. + /// + /// The directory service. + /// The path. + /// The file system. + /// The logger. + /// The args. + /// The flatten folder depth. + /// if set to true [resolve shortcuts]. + /// Dictionary{System.StringFileSystemInfo}. + /// path + public static FileSystemMetadata[] GetFilteredFileSystemEntries(IDirectoryService directoryService, + string path, + IFileSystem fileSystem, + IServerApplicationHost appHost, + ILogger logger, + ItemResolveArgs args, + int flattenFolderDepth = 0, + bool resolveShortcuts = true) + { + if (string.IsNullOrEmpty(path)) + { + throw new ArgumentNullException("path"); + } + if (args == null) + { + throw new ArgumentNullException("args"); + } + + var entries = directoryService.GetFileSystemEntries(path); + + if (!resolveShortcuts && flattenFolderDepth == 0) + { + return entries; + } + + var dict = new Dictionary(StringComparer.OrdinalIgnoreCase); + + foreach (var entry in entries) + { + var isDirectory = entry.IsDirectory; + + var fullName = entry.FullName; + + if (resolveShortcuts && fileSystem.IsShortcut(fullName)) + { + try + { + var newPath = appHost.ExpandVirtualPath(fileSystem.ResolveShortcut(fullName)); + + if (string.IsNullOrEmpty(newPath)) + { + //invalid shortcut - could be old or target could just be unavailable + logger.Warn("Encountered invalid shortcut: " + fullName); + continue; + } + + // Don't check if it exists here because that could return false for network shares. + var data = fileSystem.GetDirectoryInfo(newPath); + + // add to our physical locations + args.AddAdditionalLocation(newPath); + + dict[newPath] = data; + } + catch (Exception ex) + { + logger.ErrorException("Error resolving shortcut from {0}", ex, fullName); + } + } + else if (flattenFolderDepth > 0 && isDirectory) + { + foreach (var child in GetFilteredFileSystemEntries(directoryService, fullName, fileSystem, appHost, logger, args, flattenFolderDepth: flattenFolderDepth - 1, resolveShortcuts: resolveShortcuts)) + { + dict[child.FullName] = child; + } + } + else + { + dict[fullName] = entry; + } + } + + var returnResult = new FileSystemMetadata[dict.Count]; + var index = 0; + var values = dict.Values; + foreach (var value in values) + { + returnResult[index] = value; + index++; + } + return returnResult; + } + + } + +} -- cgit v1.2.3