12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- using MediaBrowser.Model.Logging;
- using System;
- using System.Collections.Concurrent;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- namespace MediaBrowser.Controller.Providers
- {
- public interface IDirectoryService
- {
- List<FileSystemInfo> GetFileSystemEntries(string path);
- IEnumerable<FileSystemInfo> GetFiles(string path);
- IEnumerable<FileSystemInfo> GetFiles(string path, bool clearCache);
- FileSystemInfo GetFile(string path);
- }
- public class DirectoryService : IDirectoryService
- {
- private readonly ILogger _logger;
- private readonly ConcurrentDictionary<string, List<FileSystemInfo>> _cache = new ConcurrentDictionary<string, List<FileSystemInfo>>(StringComparer.OrdinalIgnoreCase);
- public DirectoryService(ILogger logger)
- {
- _logger = logger;
- }
- public List<FileSystemInfo> GetFileSystemEntries(string path)
- {
- return GetFileSystemEntries(path, false);
- }
- private List<FileSystemInfo> GetFileSystemEntries(string path, bool clearCache)
- {
- List<FileSystemInfo> entries;
- if (clearCache)
- {
- List<FileSystemInfo> removed;
- _cache.TryRemove(path, out removed);
- }
- 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<FileSystemInfo>();
- }
- _cache.TryAdd(path, entries);
- }
- return entries;
- }
- public IEnumerable<FileSystemInfo> GetFiles(string path)
- {
- return GetFiles(path, false);
- }
- public IEnumerable<FileSystemInfo> GetFiles(string path, bool clearCache)
- {
- return GetFileSystemEntries(path, clearCache).Where(i => (i.Attributes & FileAttributes.Directory) != FileAttributes.Directory);
- }
- public FileSystemInfo 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));
- }
- }
- }
|