From 52980d0805c3bcb856163d0e1511380cbb67dfb5 Mon Sep 17 00:00:00 2001 From: Paul Fresquet Date: Tue, 10 Feb 2026 18:26:17 +0100 Subject: [PATCH 1/6] refactor: centralize noise file detection --- .../Inventories/FileSystemInspector.cs | 10 +---- .../Services/Inventories/NoiseFileDetector.cs | 40 +++++++++++++++++++ 2 files changed, 42 insertions(+), 8 deletions(-) create mode 100644 src/ByteSync.Client/Services/Inventories/NoiseFileDetector.cs diff --git a/src/ByteSync.Client/Services/Inventories/FileSystemInspector.cs b/src/ByteSync.Client/Services/Inventories/FileSystemInspector.cs index 213add22..47e33b74 100644 --- a/src/ByteSync.Client/Services/Inventories/FileSystemInspector.cs +++ b/src/ByteSync.Client/Services/Inventories/FileSystemInspector.cs @@ -63,13 +63,7 @@ public bool IsSystemAttribute(FileInfo fileInfo) public bool IsNoiseFileName(FileInfo fileInfo, OSPlatforms os) { - var comparison = os == OSPlatforms.Linux ? StringComparison.Ordinal : StringComparison.OrdinalIgnoreCase; - - return fileInfo.Name.Equals("desktop.ini", comparison) - || fileInfo.Name.Equals("thumbs.db", comparison) - || fileInfo.Name.Equals(".desktop.ini", comparison) - || fileInfo.Name.Equals(".thumbs.db", comparison) - || fileInfo.Name.Equals(".DS_Store", comparison); + return NoiseFileDetector.IsNoiseFileName(fileInfo.Name, os); } public bool IsReparsePoint(FileSystemInfo fsi) @@ -120,4 +114,4 @@ private bool SafeIsReparsePoint(FileSystemInfo fsi) return false; } } -} \ No newline at end of file +} diff --git a/src/ByteSync.Client/Services/Inventories/NoiseFileDetector.cs b/src/ByteSync.Client/Services/Inventories/NoiseFileDetector.cs new file mode 100644 index 00000000..e95c161b --- /dev/null +++ b/src/ByteSync.Client/Services/Inventories/NoiseFileDetector.cs @@ -0,0 +1,40 @@ +using ByteSync.Common.Business.Misc; + +namespace ByteSync.Services.Inventories; + +public static class NoiseFileDetector +{ + private static readonly string[] KnownNoiseFileNames = + [ + "desktop.ini", + "thumbs.db", + "ehthumbs.db", + "ehthumbs_vista.db", + ".desktop.ini", + ".thumbs.db", + ".DS_Store", + ".AppleDouble", + ".LSOverride", + ".Spotlight-V100", + ".Trashes", + ".fseventsd", + ".TemporaryItems", + ".VolumeIcon.icns", + ".directory" + ]; + + private static readonly HashSet CaseSensitiveNoiseFileNames = new(KnownNoiseFileNames, StringComparer.Ordinal); + private static readonly HashSet CaseInsensitiveNoiseFileNames = new(KnownNoiseFileNames, StringComparer.OrdinalIgnoreCase); + + public static bool IsNoiseFileName(string? fileName, OSPlatforms os) + { + if (string.IsNullOrWhiteSpace(fileName)) + { + return false; + } + + return os == OSPlatforms.Linux + ? CaseSensitiveNoiseFileNames.Contains(fileName) + : CaseInsensitiveNoiseFileNames.Contains(fileName); + } +} From 024097b178bd8049592a95a60a26fa68adce194c Mon Sep 17 00:00:00 2001 From: Paul Fresquet Date: Tue, 10 Feb 2026 18:26:24 +0100 Subject: [PATCH 2/6] test: add dedicated noise file detection coverage --- .../Inventories/FileSystemInspectorTests.cs | 45 ++++++- .../Inventories/NoiseFileDetectorTests.cs | 110 ++++++++++++++++++ 2 files changed, 154 insertions(+), 1 deletion(-) create mode 100644 tests/ByteSync.Client.UnitTests/Services/Inventories/NoiseFileDetectorTests.cs diff --git a/tests/ByteSync.Client.UnitTests/Services/Inventories/FileSystemInspectorTests.cs b/tests/ByteSync.Client.UnitTests/Services/Inventories/FileSystemInspectorTests.cs index 618a7fcc..f69d72c2 100644 --- a/tests/ByteSync.Client.UnitTests/Services/Inventories/FileSystemInspectorTests.cs +++ b/tests/ByteSync.Client.UnitTests/Services/Inventories/FileSystemInspectorTests.cs @@ -1,4 +1,5 @@ using ByteSync.Business.Inventories; +using ByteSync.Common.Business.Misc; using ByteSync.Interfaces.Controls.Inventories; using ByteSync.Services.Inventories; using FluentAssertions; @@ -131,4 +132,46 @@ public void ClassifyEntry_FallsBackToRegularFile_WhenPosixClassifierThrows() Directory.Delete(tempDirectory.FullName, true); } } -} \ No newline at end of file + + [Test] + public void IsNoiseFileName_ShouldReturnTrue_ForKnownNoiseFile() + { + var inspector = new FileSystemInspector(); + var tempDirectory = Directory.CreateDirectory(Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString("N"))); + var filePath = Path.Combine(tempDirectory.FullName, "thumbs.db"); + File.WriteAllText(filePath, "x"); + var fileInfo = new FileInfo(filePath); + + try + { + var result = inspector.IsNoiseFileName(fileInfo, OSPlatforms.Windows); + + result.Should().BeTrue(); + } + finally + { + Directory.Delete(tempDirectory.FullName, true); + } + } + + [Test] + public void IsNoiseFileName_ShouldReturnFalse_ForUnknownFile() + { + var inspector = new FileSystemInspector(); + var tempDirectory = Directory.CreateDirectory(Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString("N"))); + var filePath = Path.Combine(tempDirectory.FullName, "regular.txt"); + File.WriteAllText(filePath, "x"); + var fileInfo = new FileInfo(filePath); + + try + { + var result = inspector.IsNoiseFileName(fileInfo, OSPlatforms.Windows); + + result.Should().BeFalse(); + } + finally + { + Directory.Delete(tempDirectory.FullName, true); + } + } +} diff --git a/tests/ByteSync.Client.UnitTests/Services/Inventories/NoiseFileDetectorTests.cs b/tests/ByteSync.Client.UnitTests/Services/Inventories/NoiseFileDetectorTests.cs new file mode 100644 index 00000000..e5d799d5 --- /dev/null +++ b/tests/ByteSync.Client.UnitTests/Services/Inventories/NoiseFileDetectorTests.cs @@ -0,0 +1,110 @@ +using ByteSync.Common.Business.Misc; +using ByteSync.Services.Inventories; +using FluentAssertions; +using NUnit.Framework; + +namespace ByteSync.Client.UnitTests.Services.Inventories; + +public class NoiseFileDetectorTests +{ + private static readonly string[] KnownNoiseFileNames = + [ + "desktop.ini", + "thumbs.db", + "ehthumbs.db", + "ehthumbs_vista.db", + ".desktop.ini", + ".thumbs.db", + ".DS_Store", + ".AppleDouble", + ".LSOverride", + ".Spotlight-V100", + ".Trashes", + ".fseventsd", + ".TemporaryItems", + ".VolumeIcon.icns", + ".directory" + ]; + + [TestCaseSource(nameof(KnownNoiseFileNames))] + public void IsNoiseFileName_ShouldReturnTrue_ForKnownNoiseFiles_OnWindows(string fileName) + { + var result = NoiseFileDetector.IsNoiseFileName(fileName, OSPlatforms.Windows); + + result.Should().BeTrue(); + } + + [TestCaseSource(nameof(KnownNoiseFileNames))] + public void IsNoiseFileName_ShouldReturnTrue_ForKnownNoiseFiles_OnLinux(string fileName) + { + var result = NoiseFileDetector.IsNoiseFileName(fileName, OSPlatforms.Linux); + + result.Should().BeTrue(); + } + + [TestCase("DESKTOP.INI")] + [TestCase("THUMBS.DB")] + [TestCase("EHTHUMBS.DB")] + [TestCase("EHTHUMBS_VISTA.DB")] + [TestCase(".ds_store")] + [TestCase(".appledouble")] + [TestCase(".lsoverride")] + [TestCase(".spotlight-v100")] + [TestCase(".trashes")] + [TestCase(".FSEVENTSD")] + [TestCase(".temporaryitems")] + [TestCase(".volumeicon.icns")] + [TestCase(".DIRECTORY")] + public void IsNoiseFileName_ShouldBeCaseInsensitive_OnNonLinuxPlatforms(string fileName) + { + var windowsResult = NoiseFileDetector.IsNoiseFileName(fileName, OSPlatforms.Windows); + var macResult = NoiseFileDetector.IsNoiseFileName(fileName, OSPlatforms.MacOs); + + windowsResult.Should().BeTrue(); + macResult.Should().BeTrue(); + } + + [TestCase("DESKTOP.INI")] + [TestCase("THUMBS.DB")] + [TestCase("EHTHUMBS.DB")] + [TestCase("EHTHUMBS_VISTA.DB")] + [TestCase(".ds_store")] + [TestCase(".appledouble")] + [TestCase(".lsoverride")] + [TestCase(".spotlight-v100")] + [TestCase(".trashes")] + [TestCase(".FSEVENTSD")] + [TestCase(".temporaryitems")] + [TestCase(".volumeicon.icns")] + [TestCase(".DIRECTORY")] + public void IsNoiseFileName_ShouldBeCaseSensitive_OnLinux(string fileName) + { + var result = NoiseFileDetector.IsNoiseFileName(fileName, OSPlatforms.Linux); + + result.Should().BeFalse(); + } + + [TestCase("readme.md")] + [TestCase("normal.txt")] + [TestCase(".gitignore")] + public void IsNoiseFileName_ShouldReturnFalse_ForUnknownFileNames(string fileName) + { + var windowsResult = NoiseFileDetector.IsNoiseFileName(fileName, OSPlatforms.Windows); + var linuxResult = NoiseFileDetector.IsNoiseFileName(fileName, OSPlatforms.Linux); + + windowsResult.Should().BeFalse(); + linuxResult.Should().BeFalse(); + } + + [TestCase(null)] + [TestCase("")] + [TestCase(" ")] + public void IsNoiseFileName_ShouldReturnFalse_ForEmptyValues(string? fileName) + { + var windowsResult = NoiseFileDetector.IsNoiseFileName(fileName, OSPlatforms.Windows); + var linuxResult = NoiseFileDetector.IsNoiseFileName(fileName, OSPlatforms.Linux); + + windowsResult.Should().BeFalse(); + linuxResult.Should().BeFalse(); + } +} From c30ecb9a86dd25ce9df24b00a5ce5fa37f15c260 Mon Sep 17 00:00:00 2001 From: Paul Fresquet Date: Tue, 10 Feb 2026 18:26:29 +0100 Subject: [PATCH 3/6] docs: document noise file origins by platform --- docs/specs/SPEC-noise-file-detection.md | 30 +++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 docs/specs/SPEC-noise-file-detection.md diff --git a/docs/specs/SPEC-noise-file-detection.md b/docs/specs/SPEC-noise-file-detection.md new file mode 100644 index 00000000..9101c1a4 --- /dev/null +++ b/docs/specs/SPEC-noise-file-detection.md @@ -0,0 +1,30 @@ +# Noise File Detection Specification + +## Purpose + +This document lists the known noise file names filtered by the client inventory pipeline and their platform origin. + +## Known noise file names + +| File name | Origin platform | Typical purpose | +| --- | --- | --- | +| `desktop.ini` | Windows | Folder customization metadata | +| `thumbs.db` | Windows | Thumbnail cache | +| `ehthumbs.db` | Windows | Media Center thumbnail cache | +| `ehthumbs_vista.db` | Windows | Vista Media Center thumbnail cache | +| `.desktop.ini` | Windows/Linux legacy compatibility | Legacy hidden variant | +| `.thumbs.db` | Windows/Linux legacy compatibility | Legacy hidden variant | +| `.DS_Store` | macOS | Finder metadata | +| `.AppleDouble` | macOS | Resource fork metadata | +| `.LSOverride` | macOS | Launch Services overrides | +| `.Spotlight-V100` | macOS | Spotlight indexing data | +| `.Trashes` | macOS | Trash metadata or folder marker | +| `.fseventsd` | macOS | File system event metadata | +| `.TemporaryItems` | macOS | Temporary items marker | +| `.VolumeIcon.icns` | macOS | Custom volume icon | +| `.directory` | Linux (KDE) | Directory display metadata | + +## Matching behavior + +- On Linux, matching is case-sensitive. +- On non-Linux platforms, matching is case-insensitive. From b9a6035face9090e055f347f7d08a75682c62f42 Mon Sep 17 00:00:00 2001 From: Paul Fresquet Date: Wed, 11 Feb 2026 08:03:34 +0100 Subject: [PATCH 4/6] refactor: load noise list from embedded json resource --- docs/specs/SPEC-noise-file-detection.md | 3 ++ src/ByteSync.Client/ByteSync.Client.csproj | 3 +- .../Services/Inventories/NoiseFileDetector.cs | 51 ++++++++++++------- .../Services/Inventories/noise-files.json | 17 +++++++ .../Inventories/NoiseFileDetectorTests.cs | 38 +++++++------- 5 files changed, 75 insertions(+), 37 deletions(-) create mode 100644 src/ByteSync.Client/Services/Inventories/noise-files.json diff --git a/docs/specs/SPEC-noise-file-detection.md b/docs/specs/SPEC-noise-file-detection.md index 9101c1a4..0d56cabf 100644 --- a/docs/specs/SPEC-noise-file-detection.md +++ b/docs/specs/SPEC-noise-file-detection.md @@ -4,6 +4,9 @@ This document lists the known noise file names filtered by the client inventory pipeline and their platform origin. +The runtime source of truth is the embedded JSON resource: +`src/ByteSync.Client/Services/Inventories/noise-files.json`. + ## Known noise file names | File name | Origin platform | Typical purpose | diff --git a/src/ByteSync.Client/ByteSync.Client.csproj b/src/ByteSync.Client/ByteSync.Client.csproj index 25d640f9..81826295 100644 --- a/src/ByteSync.Client/ByteSync.Client.csproj +++ b/src/ByteSync.Client/ByteSync.Client.csproj @@ -111,6 +111,7 @@ + @@ -258,4 +259,4 @@ Code - \ No newline at end of file + diff --git a/src/ByteSync.Client/Services/Inventories/NoiseFileDetector.cs b/src/ByteSync.Client/Services/Inventories/NoiseFileDetector.cs index e95c161b..186b6a32 100644 --- a/src/ByteSync.Client/Services/Inventories/NoiseFileDetector.cs +++ b/src/ByteSync.Client/Services/Inventories/NoiseFileDetector.cs @@ -1,27 +1,13 @@ +using System.Reflection; +using System.Text.Json; using ByteSync.Common.Business.Misc; namespace ByteSync.Services.Inventories; public static class NoiseFileDetector { - private static readonly string[] KnownNoiseFileNames = - [ - "desktop.ini", - "thumbs.db", - "ehthumbs.db", - "ehthumbs_vista.db", - ".desktop.ini", - ".thumbs.db", - ".DS_Store", - ".AppleDouble", - ".LSOverride", - ".Spotlight-V100", - ".Trashes", - ".fseventsd", - ".TemporaryItems", - ".VolumeIcon.icns", - ".directory" - ]; + private const string NoiseFileResourceSuffix = ".Services.Inventories.noise-files.json"; + private static readonly string[] KnownNoiseFileNames = LoadNoiseFileNames(); private static readonly HashSet CaseSensitiveNoiseFileNames = new(KnownNoiseFileNames, StringComparer.Ordinal); private static readonly HashSet CaseInsensitiveNoiseFileNames = new(KnownNoiseFileNames, StringComparer.OrdinalIgnoreCase); @@ -37,4 +23,33 @@ public static bool IsNoiseFileName(string? fileName, OSPlatforms os) ? CaseSensitiveNoiseFileNames.Contains(fileName) : CaseInsensitiveNoiseFileNames.Contains(fileName); } + + private static string[] LoadNoiseFileNames() + { + var assembly = typeof(NoiseFileDetector).Assembly; + var resourceName = assembly.GetManifestResourceNames() + .SingleOrDefault(rn => rn.EndsWith(NoiseFileResourceSuffix, StringComparison.Ordinal)); + + if (resourceName == null) + { + throw new InvalidOperationException($"Embedded resource not found: '*{NoiseFileResourceSuffix}'"); + } + + using var stream = assembly.GetManifestResourceStream(resourceName); + if (stream == null) + { + throw new InvalidOperationException($"Unable to open embedded resource stream: '{resourceName}'"); + } + + var parsed = JsonSerializer.Deserialize(stream); + if (parsed == null) + { + throw new InvalidOperationException($"Unable to deserialize embedded resource: '{resourceName}'"); + } + + return parsed + .Where(s => !string.IsNullOrWhiteSpace(s)) + .Distinct(StringComparer.Ordinal) + .ToArray(); + } } diff --git a/src/ByteSync.Client/Services/Inventories/noise-files.json b/src/ByteSync.Client/Services/Inventories/noise-files.json new file mode 100644 index 00000000..22093319 --- /dev/null +++ b/src/ByteSync.Client/Services/Inventories/noise-files.json @@ -0,0 +1,17 @@ +[ + "desktop.ini", + "thumbs.db", + "ehthumbs.db", + "ehthumbs_vista.db", + ".desktop.ini", + ".thumbs.db", + ".DS_Store", + ".AppleDouble", + ".LSOverride", + ".Spotlight-V100", + ".Trashes", + ".fseventsd", + ".TemporaryItems", + ".VolumeIcon.icns", + ".directory" +] diff --git a/tests/ByteSync.Client.UnitTests/Services/Inventories/NoiseFileDetectorTests.cs b/tests/ByteSync.Client.UnitTests/Services/Inventories/NoiseFileDetectorTests.cs index e5d799d5..12c8b2a4 100644 --- a/tests/ByteSync.Client.UnitTests/Services/Inventories/NoiseFileDetectorTests.cs +++ b/tests/ByteSync.Client.UnitTests/Services/Inventories/NoiseFileDetectorTests.cs @@ -1,3 +1,5 @@ +using System.Reflection; +using System.Text.Json; using ByteSync.Common.Business.Misc; using ByteSync.Services.Inventories; using FluentAssertions; @@ -7,24 +9,7 @@ namespace ByteSync.Client.UnitTests.Services.Inventories; public class NoiseFileDetectorTests { - private static readonly string[] KnownNoiseFileNames = - [ - "desktop.ini", - "thumbs.db", - "ehthumbs.db", - "ehthumbs_vista.db", - ".desktop.ini", - ".thumbs.db", - ".DS_Store", - ".AppleDouble", - ".LSOverride", - ".Spotlight-V100", - ".Trashes", - ".fseventsd", - ".TemporaryItems", - ".VolumeIcon.icns", - ".directory" - ]; + private static readonly string[] KnownNoiseFileNames = LoadNoiseFileNamesFromEmbeddedResource(); [TestCaseSource(nameof(KnownNoiseFileNames))] public void IsNoiseFileName_ShouldReturnTrue_ForKnownNoiseFiles_OnWindows(string fileName) @@ -107,4 +92,21 @@ public void IsNoiseFileName_ShouldReturnFalse_ForEmptyValues(string? fileName) windowsResult.Should().BeFalse(); linuxResult.Should().BeFalse(); } + + private static string[] LoadNoiseFileNamesFromEmbeddedResource() + { + var assembly = typeof(NoiseFileDetector).Assembly; + var resourceName = assembly.GetManifestResourceNames() + .SingleOrDefault(rn => rn.EndsWith(".Services.Inventories.noise-files.json", StringComparison.Ordinal)); + + resourceName.Should().NotBeNull(); + + using var stream = assembly.GetManifestResourceStream(resourceName!); + stream.Should().NotBeNull(); + + var data = JsonSerializer.Deserialize(stream!); + data.Should().NotBeNull(); + + return data!; + } } From cb9b454e88c535ec2fdb0f41b99c55a33ee32aa1 Mon Sep 17 00:00:00 2001 From: Paul Fresquet Date: Wed, 11 Feb 2026 08:06:33 +0100 Subject: [PATCH 5/6] refactor: cleanup --- .../Inventories/NoiseFileDetectorTests.cs | 37 +++++++++---------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/tests/ByteSync.Client.UnitTests/Services/Inventories/NoiseFileDetectorTests.cs b/tests/ByteSync.Client.UnitTests/Services/Inventories/NoiseFileDetectorTests.cs index 12c8b2a4..80fb9d1e 100644 --- a/tests/ByteSync.Client.UnitTests/Services/Inventories/NoiseFileDetectorTests.cs +++ b/tests/ByteSync.Client.UnitTests/Services/Inventories/NoiseFileDetectorTests.cs @@ -1,4 +1,3 @@ -using System.Reflection; using System.Text.Json; using ByteSync.Common.Business.Misc; using ByteSync.Services.Inventories; @@ -10,23 +9,23 @@ namespace ByteSync.Client.UnitTests.Services.Inventories; public class NoiseFileDetectorTests { private static readonly string[] KnownNoiseFileNames = LoadNoiseFileNamesFromEmbeddedResource(); - + [TestCaseSource(nameof(KnownNoiseFileNames))] public void IsNoiseFileName_ShouldReturnTrue_ForKnownNoiseFiles_OnWindows(string fileName) { var result = NoiseFileDetector.IsNoiseFileName(fileName, OSPlatforms.Windows); - + result.Should().BeTrue(); } - + [TestCaseSource(nameof(KnownNoiseFileNames))] public void IsNoiseFileName_ShouldReturnTrue_ForKnownNoiseFiles_OnLinux(string fileName) { var result = NoiseFileDetector.IsNoiseFileName(fileName, OSPlatforms.Linux); - + result.Should().BeTrue(); } - + [TestCase("DESKTOP.INI")] [TestCase("THUMBS.DB")] [TestCase("EHTHUMBS.DB")] @@ -44,11 +43,11 @@ public void IsNoiseFileName_ShouldBeCaseInsensitive_OnNonLinuxPlatforms(string f { var windowsResult = NoiseFileDetector.IsNoiseFileName(fileName, OSPlatforms.Windows); var macResult = NoiseFileDetector.IsNoiseFileName(fileName, OSPlatforms.MacOs); - + windowsResult.Should().BeTrue(); macResult.Should().BeTrue(); } - + [TestCase("DESKTOP.INI")] [TestCase("THUMBS.DB")] [TestCase("EHTHUMBS.DB")] @@ -65,10 +64,10 @@ public void IsNoiseFileName_ShouldBeCaseInsensitive_OnNonLinuxPlatforms(string f public void IsNoiseFileName_ShouldBeCaseSensitive_OnLinux(string fileName) { var result = NoiseFileDetector.IsNoiseFileName(fileName, OSPlatforms.Linux); - + result.Should().BeFalse(); } - + [TestCase("readme.md")] [TestCase("normal.txt")] [TestCase(".gitignore")] @@ -76,11 +75,11 @@ public void IsNoiseFileName_ShouldReturnFalse_ForUnknownFileNames(string fileNam { var windowsResult = NoiseFileDetector.IsNoiseFileName(fileName, OSPlatforms.Windows); var linuxResult = NoiseFileDetector.IsNoiseFileName(fileName, OSPlatforms.Linux); - + windowsResult.Should().BeFalse(); linuxResult.Should().BeFalse(); } - + [TestCase(null)] [TestCase("")] [TestCase(" ")] @@ -88,25 +87,25 @@ public void IsNoiseFileName_ShouldReturnFalse_ForEmptyValues(string? fileName) { var windowsResult = NoiseFileDetector.IsNoiseFileName(fileName, OSPlatforms.Windows); var linuxResult = NoiseFileDetector.IsNoiseFileName(fileName, OSPlatforms.Linux); - + windowsResult.Should().BeFalse(); linuxResult.Should().BeFalse(); } - + private static string[] LoadNoiseFileNamesFromEmbeddedResource() { var assembly = typeof(NoiseFileDetector).Assembly; var resourceName = assembly.GetManifestResourceNames() .SingleOrDefault(rn => rn.EndsWith(".Services.Inventories.noise-files.json", StringComparison.Ordinal)); - + resourceName.Should().NotBeNull(); - + using var stream = assembly.GetManifestResourceStream(resourceName!); stream.Should().NotBeNull(); - + var data = JsonSerializer.Deserialize(stream!); data.Should().NotBeNull(); - + return data!; } -} +} \ No newline at end of file From fabc4ceed1d15a9c5a0baa507ca3bc46a9b455f2 Mon Sep 17 00:00:00 2001 From: Paul Fresquet Date: Wed, 11 Feb 2026 08:52:44 +0100 Subject: [PATCH 6/6] refactor: simplify noise resource loading guards --- .../Services/Inventories/NoiseFileDetector.cs | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/src/ByteSync.Client/Services/Inventories/NoiseFileDetector.cs b/src/ByteSync.Client/Services/Inventories/NoiseFileDetector.cs index 186b6a32..bba9cf56 100644 --- a/src/ByteSync.Client/Services/Inventories/NoiseFileDetector.cs +++ b/src/ByteSync.Client/Services/Inventories/NoiseFileDetector.cs @@ -28,24 +28,13 @@ private static string[] LoadNoiseFileNames() { var assembly = typeof(NoiseFileDetector).Assembly; var resourceName = assembly.GetManifestResourceNames() - .SingleOrDefault(rn => rn.EndsWith(NoiseFileResourceSuffix, StringComparison.Ordinal)); - - if (resourceName == null) - { - throw new InvalidOperationException($"Embedded resource not found: '*{NoiseFileResourceSuffix}'"); - } + .Single(rn => rn.EndsWith(NoiseFileResourceSuffix, StringComparison.Ordinal)); using var stream = assembly.GetManifestResourceStream(resourceName); - if (stream == null) - { - throw new InvalidOperationException($"Unable to open embedded resource stream: '{resourceName}'"); - } + ArgumentNullException.ThrowIfNull(stream); var parsed = JsonSerializer.Deserialize(stream); - if (parsed == null) - { - throw new InvalidOperationException($"Unable to deserialize embedded resource: '{resourceName}'"); - } + ArgumentNullException.ThrowIfNull(parsed); return parsed .Where(s => !string.IsNullOrWhiteSpace(s))