From def0b1f6114483a8b5677fc27ffcfeef3e241154 Mon Sep 17 00:00:00 2001 From: Michael Bucari-Tovo Date: Thu, 6 Nov 2025 14:46:01 -0700 Subject: [PATCH] Prevent crash if watched RootDirectory is deleted --- Source/FileManager/BackgroundFileSystem.cs | 14 ++++++-- .../LibationFileManager/AudibleFileStorage.cs | 32 ++++++++++--------- 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/Source/FileManager/BackgroundFileSystem.cs b/Source/FileManager/BackgroundFileSystem.cs index 4dec3b8a..0b37a572 100644 --- a/Source/FileManager/BackgroundFileSystem.cs +++ b/Source/FileManager/BackgroundFileSystem.cs @@ -14,7 +14,7 @@ namespace FileManager /// public class BackgroundFileSystem : IDisposable { - public LongPath RootDirectory { get; private set; } + public LongPath? RootDirectory { get; private set; } public string SearchPattern { get; private set; } public SearchOption SearchOption { get; private set; } @@ -51,7 +51,8 @@ namespace FileManager lock (fsCacheLocker) { fsCache.Clear(); - fsCache.AddRange(SafestEnumerateFiles(RootDirectory)); + if (Directory.Exists(RootDirectory)) + fsCache.AddRange(SafestEnumerateFiles(RootDirectory)); } } @@ -60,7 +61,14 @@ namespace FileManager Stop(); lock (fsCacheLocker) - fsCache.AddRange(SafestEnumerateFiles(RootDirectory)); + { + if (!Directory.Exists(RootDirectory)) + { + RootDirectory = null; + return; + } + fsCache.AddRange(SafestEnumerateFiles(RootDirectory)); + } directoryChangesEvents = new BlockingCollection(); fileSystemWatcher = new FileSystemWatcher(RootDirectory) diff --git a/Source/LibationFileManager/AudibleFileStorage.cs b/Source/LibationFileManager/AudibleFileStorage.cs index 0213038c..566469dd 100644 --- a/Source/LibationFileManager/AudibleFileStorage.cs +++ b/Source/LibationFileManager/AudibleFileStorage.cs @@ -146,16 +146,7 @@ namespace LibationFileManager protected override List GetFilePathsCustom(string productId) { - // If user changed the BooksDirectory: reinitialize - lock (bookDirectoryFilesLocker) - { - if (BooksDirectory != BookDirectoryFiles?.RootDirectory) - { - BookDirectoryFiles?.Dispose(); - BookDirectoryFiles = newBookDirectoryFiles(); - } - } - + ValidateBookDirectoryFiles(); var regex = GetBookSearchRegex(productId); var diskFiles = BookDirectoryFiles?.FindFiles(regex) ?? []; @@ -172,14 +163,25 @@ namespace LibationFileManager public void Refresh() { - lock (bookDirectoryFilesLocker) - { - BookDirectoryFiles ??= newBookDirectoryFiles(); - } - + ValidateBookDirectoryFiles(); BookDirectoryFiles?.RefreshFiles(); } + private void ValidateBookDirectoryFiles() + { + lock (bookDirectoryFilesLocker) + { + if (BooksDirectory != BookDirectoryFiles?.RootDirectory) + { + //Will happen if the user changed the Books directory + //or if BackgroundFileSystem errored out. + BookDirectoryFiles?.Dispose(); + BookDirectoryFiles = newBookDirectoryFiles(); + } + } + } + + public LongPath? GetPath(string productId) => GetFilePath(productId); public static async IAsyncEnumerable FindAudiobooksAsync(LongPath searchDirectory, [EnumeratorCancellation] CancellationToken cancellationToken)