DirectoryService.cs 2.4 KB

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