diff --git a/AppScaffolding/AppScaffolding.csproj b/AppScaffolding/AppScaffolding.csproj index 00c11946..7349b2a6 100644 --- a/AppScaffolding/AppScaffolding.csproj +++ b/AppScaffolding/AppScaffolding.csproj @@ -3,7 +3,7 @@ net6.0 - 6.7.4.1 + 6.7.5.1 diff --git a/AppScaffolding/LibationScaffolding.cs b/AppScaffolding/LibationScaffolding.cs index a4de712c..3089b6f5 100644 --- a/AppScaffolding/LibationScaffolding.cs +++ b/AppScaffolding/LibationScaffolding.cs @@ -230,10 +230,10 @@ namespace AppScaffolding config.InProgress, AudibleFileStorage.DownloadsInProgressDirectory, - DownloadsInProgressFiles = Directory.EnumerateFiles(AudibleFileStorage.DownloadsInProgressDirectory).Count(), + DownloadsInProgressFiles = FileManager.FileUtility.SaferEnumerateFiles(AudibleFileStorage.DownloadsInProgressDirectory).Count(), AudibleFileStorage.DecryptInProgressDirectory, - DecryptInProgressFiles = Directory.EnumerateFiles(AudibleFileStorage.DecryptInProgressDirectory).Count(), + DecryptInProgressFiles = FileManager.FileUtility.SaferEnumerateFiles(AudibleFileStorage.DecryptInProgressDirectory).Count(), }); } diff --git a/FileManager/BackgroundFileSystem.cs b/FileManager/BackgroundFileSystem.cs index 2144cf80..4dbf1f93 100644 --- a/FileManager/BackgroundFileSystem.cs +++ b/FileManager/BackgroundFileSystem.cs @@ -43,7 +43,7 @@ namespace FileManager lock (fsCacheLocker) { fsCache.Clear(); - fsCache.AddRange(Directory.EnumerateFiles(RootDirectory, SearchPattern, SearchOption)); + fsCache.AddRange(FileUtility.SaferEnumerateFiles(RootDirectory, SearchPattern, SearchOption)); } } @@ -52,7 +52,7 @@ namespace FileManager Stop(); lock (fsCacheLocker) - fsCache.AddRange(Directory.EnumerateFiles(RootDirectory, SearchPattern, SearchOption)); + fsCache.AddRange(FileUtility.SaferEnumerateFiles(RootDirectory, SearchPattern, SearchOption)); directoryChangesEvents = new BlockingCollection(); fileSystemWatcher = new FileSystemWatcher(RootDirectory) @@ -135,7 +135,7 @@ namespace FileManager private void AddPath(string path) { if (File.GetAttributes(path).HasFlag(FileAttributes.Directory)) - AddUniqueFiles(Directory.EnumerateFiles(path, SearchPattern, SearchOption)); + AddUniqueFiles(FileUtility.SaferEnumerateFiles(path, SearchPattern, SearchOption)); else AddUniqueFile(path); } diff --git a/FileManager/FileUtility.cs b/FileManager/FileUtility.cs index 22278917..025c63a8 100644 --- a/FileManager/FileUtility.cs +++ b/FileManager/FileUtility.cs @@ -234,5 +234,39 @@ namespace FileManager throw; } }); + + /// + /// A safer way to get all the files in a directory and sub directory without crashing on UnauthorizedException or PathTooLongException + /// + /// Starting directory + /// Filename pattern match + /// Search subdirectories or only top level directory for files + /// List of files + public static IEnumerable SaferEnumerateFiles(string path, string searchPattern = "*", SearchOption searchOption = SearchOption.TopDirectoryOnly) + { + var foundFiles = Enumerable.Empty(); + + if (searchOption == SearchOption.AllDirectories) + { + try + { + IEnumerable subDirs = Directory.EnumerateDirectories(path); + // Add files in subdirectories recursively to the list + foreach (string dir in subDirs) + foundFiles = foundFiles.Concat(SaferEnumerateFiles(dir, searchPattern, searchOption)); + } + catch (UnauthorizedAccessException) { } + catch (PathTooLongException) { } + } + + try + { + // Add files from the current directory + foundFiles = foundFiles.Concat(Directory.EnumerateFiles(path, searchPattern)); + } + catch (UnauthorizedAccessException) { } + + return foundFiles; + } } } diff --git a/LibationFileManager/AudibleFileStorage.cs b/LibationFileManager/AudibleFileStorage.cs index 7fb8392d..1341256e 100644 --- a/LibationFileManager/AudibleFileStorage.cs +++ b/LibationFileManager/AudibleFileStorage.cs @@ -73,8 +73,8 @@ namespace LibationFileManager protected override string GetFilePathCustom(string productId) { var regex = GetBookSearchRegex(productId); - return Directory - .EnumerateFiles(DownloadsInProgressDirectory, "*.*", SearchOption.AllDirectories) + return FileUtility + .SaferEnumerateFiles(DownloadsInProgressDirectory, "*.*", SearchOption.AllDirectories) .FirstOrDefault(s => regex.IsMatch(s)); }