FolderScan.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. using System.IO.Enumeration;
  2. using FNZCM2.Abstractions.Models.Fs;
  3. namespace FNZCM2.Abstractions.Utility;
  4. using FSE = (bool isDir, string path, long size, DateTimeOffset lastWrited);
  5. public static class FolderScan
  6. {
  7. public static FolderScanResult Scan(string folderPath)
  8. {
  9. //List<IFsEntry> allEntries = new();
  10. List<FolderEntry> allFolders = new();
  11. List<FileEntry> allFiles = new();
  12. Dictionary<string, long> folderPathToIdCache = new();
  13. long GetFolderId(string path)
  14. {
  15. if (folderPathToIdCache.TryGetValue(path, out var fid)) return fid;
  16. var parts = path.Split(Path.DirectorySeparatorChar);
  17. fid = 0;
  18. foreach (var s in parts)
  19. {
  20. var d = allFolders.First(p => p.FolderId == fid && p.Name == s);
  21. fid = d.Id;
  22. }
  23. folderPathToIdCache[path] = fid;
  24. return fid;
  25. }
  26. var fullPath = Path.GetFullPath(folderPath);
  27. var fse = new FileSystemEnumerable<FSE>(
  28. fullPath,
  29. (ref FileSystemEntry p) => new(
  30. p.IsDirectory,
  31. p.ToFullPath(),
  32. p.Length,
  33. p.LastWriteTimeUtc
  34. ),
  35. new()
  36. {
  37. RecurseSubdirectories = true,
  38. });
  39. var trimPathPrefixLength = fullPath.Length + 1;
  40. foreach (var e in fse)
  41. {
  42. var rPath = e.path.Substring(trimPathPrefixLength);
  43. var directoryName = Path.GetDirectoryName(rPath);
  44. var fileName = Path.GetFileName(rPath);
  45. var folderId = string.IsNullOrEmpty(directoryName) ? 0 : GetFolderId(directoryName!);
  46. if (e.isDir)
  47. {
  48. var folderEntry = new FolderEntry
  49. {
  50. Id = DateTime.Now.Ticks,
  51. FolderId = folderId,
  52. Name = fileName,
  53. LastChangedTime = e.lastWrited,
  54. };
  55. //allEntries.Add(folderEntry);
  56. allFolders.Add(folderEntry);
  57. }
  58. else
  59. {
  60. var fileEntry = new FileEntry
  61. {
  62. Id = DateTime.Now.Ticks,
  63. FolderId = folderId,
  64. Name = fileName,
  65. LastChangedTime = e.lastWrited,
  66. Size = e.size,
  67. };
  68. //allEntries.Add(fileEntry);
  69. allFiles.Add(fileEntry);
  70. }
  71. }
  72. //var allById = allEntries.ToDictionary(e => e.Id);
  73. //var allInFolder = allEntries
  74. // .GroupBy(e => e.FolderId)
  75. // .ToDictionary(g => g.Key, g => (IReadOnlyList<IFsEntry>)g.ToArray());
  76. //var folderById = allFolders.ToDictionary(f => f.Id);
  77. //var foldersInFolder = allFolders
  78. // .GroupBy(f => f.FolderId)
  79. // .ToDictionary(g => g.Key, g => (IReadOnlyList<FolderEntry>)g.ToArray());
  80. //var fileById = allFiles.ToDictionary(f => f.Id);
  81. //var filesInFolder = allFiles
  82. // .GroupBy(f => f.FolderId)
  83. // .ToDictionary(g => g.Key, g => (IReadOnlyList<FileEntry>)g.ToArray());
  84. return new FolderScanResult
  85. {
  86. //All = allEntries,
  87. //AllById = allById,
  88. //AllInFolder = allInFolder,
  89. Folders = allFolders.ToArray(),
  90. //FolderById = folderById,
  91. //FoldersInFolder = foldersInFolder,
  92. Files = allFiles.ToArray(),
  93. //FileById = fileById,
  94. //FilesInFolder = filesInFolder,
  95. //add folderPathToIdCache on demands
  96. };
  97. }
  98. }