DirectoryService.cs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. using MediaBrowser.Model.Logging;
  2. using System;
  3. using System.Collections.Concurrent;
  4. using System.Collections.Generic;
  5. using System.IO;
  6. using System.Linq;
  7. namespace MediaBrowser.Controller.Providers
  8. {
  9. public interface IDirectoryService
  10. {
  11. List<FileSystemInfo> GetFileSystemEntries(string path);
  12. IEnumerable<FileSystemInfo> GetFiles(string path);
  13. FileSystemInfo GetFile(string path);
  14. }
  15. public class DirectoryService : IDirectoryService
  16. {
  17. private readonly ILogger _logger;
  18. private readonly ConcurrentDictionary<string, List<FileSystemInfo>> _cache = new ConcurrentDictionary<string, List<FileSystemInfo>>(StringComparer.OrdinalIgnoreCase);
  19. public DirectoryService(ILogger logger)
  20. {
  21. _logger = logger;
  22. }
  23. public List<FileSystemInfo> GetFileSystemEntries(string path)
  24. {
  25. List<FileSystemInfo> entries;
  26. if (!_cache.TryGetValue(path, out entries))
  27. {
  28. //_logger.Debug("Getting files for " + path);
  29. try
  30. {
  31. entries = new DirectoryInfo(path).EnumerateFileSystemInfos("*", SearchOption.TopDirectoryOnly).ToList();
  32. }
  33. catch (DirectoryNotFoundException)
  34. {
  35. entries = new List<FileSystemInfo>();
  36. }
  37. _cache.TryAdd(path, entries);
  38. }
  39. return entries;
  40. }
  41. public IEnumerable<FileSystemInfo> GetFiles(string path)
  42. {
  43. return GetFileSystemEntries(path).Where(i => (i.Attributes & FileAttributes.Directory) != FileAttributes.Directory);
  44. }
  45. public FileSystemInfo GetFile(string path)
  46. {
  47. var directory = Path.GetDirectoryName(path);
  48. var filename = Path.GetFileName(path);
  49. return GetFiles(directory).FirstOrDefault(i => string.Equals(i.Name, filename, StringComparison.OrdinalIgnoreCase));
  50. }
  51. }
  52. }