#pragma warning disable CS1591 using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using MediaBrowser.Model.IO; namespace MediaBrowser.Controller.Providers { public class DirectoryService : IDirectoryService { private readonly IFileSystem _fileSystem; private readonly ConcurrentDictionary _cache = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); private readonly ConcurrentDictionary _fileCache = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); private readonly ConcurrentDictionary> _filePathCache = new ConcurrentDictionary>(StringComparer.OrdinalIgnoreCase); public DirectoryService(IFileSystem fileSystem) { _fileSystem = fileSystem; } public FileSystemMetadata[] GetFileSystemEntries(string path) { return _cache.GetOrAdd(path, (p) => _fileSystem.GetFileSystemEntries(p).ToArray()); } public List GetFiles(string path) { var list = new List(); var items = GetFileSystemEntries(path); foreach (var item in items) { if (!item.IsDirectory) { list.Add(item); } } return list; } public FileSystemMetadata GetFile(string path) { var result = _fileCache.GetOrAdd(path, (p) => { var file = _fileSystem.GetFileInfo(path); return (file != null && file.Exists) ? file : null; }); if (result == null) { // lets not store null results in the cache _fileCache.TryRemove(path, out FileSystemMetadata removed); } return result; } public IReadOnlyList GetFilePaths(string path) => GetFilePaths(path, false); public IReadOnlyList GetFilePaths(string path, bool clearCache) { if (clearCache) { _filePathCache.TryRemove(path, out List removed); } return _filePathCache.GetOrAdd(path, (p) => _fileSystem.GetFilePaths(path).ToList()); } } }