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));
}