using System.Collections.Concurrent; using MediaBrowser.Model.Logging; using System; using System.Collections.Generic; using System.IO; using System.Linq; namespace MediaBrowser.Controller.Providers { public interface IDirectoryService { List GetFileSystemEntries(string path); IEnumerable GetFiles(string path); IEnumerable GetDirectories(string path); FileInfo GetFile(string path); DirectoryInfo GetDirectory(string path); } public class DirectoryService : IDirectoryService { private readonly ILogger _logger; private readonly ConcurrentDictionary> _cache = new ConcurrentDictionary>(StringComparer.OrdinalIgnoreCase); public DirectoryService(ILogger logger) { _logger = logger; } public List GetFileSystemEntries(string path) { List entries; if (!_cache.TryGetValue(path, out entries)) { //_logger.Debug("Getting files for " + path); try { entries = new DirectoryInfo(path).EnumerateFileSystemInfos("*", SearchOption.TopDirectoryOnly).ToList(); } catch (DirectoryNotFoundException) { entries = new List(); } _cache.TryAdd(path, entries); } return entries; } public IEnumerable GetFiles(string path) { return GetFileSystemEntries(path).OfType(); } public IEnumerable GetDirectories(string path) { return GetFileSystemEntries(path).OfType(); } public FileInfo GetFile(string path) { var directory = Path.GetDirectoryName(path); var filename = Path.GetFileName(path); return GetFiles(directory).FirstOrDefault(i => string.Equals(i.Name, filename, StringComparison.OrdinalIgnoreCase)); } public DirectoryInfo GetDirectory(string path) { var directory = Path.GetDirectoryName(path); var name = Path.GetFileName(path); return GetDirectories(directory).FirstOrDefault(i => string.Equals(i.Name, name, StringComparison.OrdinalIgnoreCase)); } } }