From 5fc1fc499c8645f6e5e20f164e3dcdba308b31fa Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Thu, 3 Aug 2023 19:54:44 -0700 Subject: [PATCH] New: Ignore inaccessible files with getting files (cherry picked from commit e5aa8584100d96a2077c57f74ae5b2ceab63de19) --- src/Lidarr.Api.V1/Logs/LogFileController.cs | 2 +- .../Logs/UpdateLogFileController.cs | 2 +- .../DiskTests/DiskTransferServiceFixture.cs | 6 +-- src/NzbDrone.Common/ArchiveService.cs | 5 ++- src/NzbDrone.Common/Disk/DiskProviderBase.cs | 31 +++++++++------ src/NzbDrone.Common/Disk/IDiskProvider.cs | 6 +-- .../Blackhole/ScanWatchFolderFixture.cs | 2 +- .../Blackhole/TorrentBlackholeFixture.cs | 2 +- .../Blackhole/UsenetBlackholeFixture.cs | 2 +- .../DiskScanServiceTests/ScanFixture.cs | 38 +++++++++++++++++-- .../GetAudioFilesFixture.cs | 16 ++++---- .../RecycleBinProviderTests/CleanupFixture.cs | 5 +-- .../DeleteDirectoryFixture.cs | 5 +-- .../RecycleBinProviderTests/EmptyFixture.cs | 3 +- src/NzbDrone.Core/Backup/BackupService.cs | 6 +-- .../Clients/Blackhole/ScanWatchFolder.cs | 4 +- .../Download/Clients/Pneumatic/Pneumatic.cs | 2 +- src/NzbDrone.Core/Extras/ExtraService.cs | 2 +- .../MediaFiles/DiskScanService.cs | 6 +-- .../DownloadedTracksImportService.cs | 2 +- .../MediaFiles/MediaFileDeletionService.cs | 9 ++--- .../MediaFiles/RecycleBinProvider.cs | 6 +-- .../MediaFiles/RootFolderWatchingService.cs | 1 + .../MacOsVersionAdapterFixture.cs | 8 ++-- .../ReleaseFileVersionAdapterFixture.cs | 10 ++--- .../IssueFileVersionAdapter.cs | 3 +- .../VersionAdapters/MacOsVersionAdapter.cs | 3 +- .../ReleaseFileVersionAdapter.cs | 3 +- .../VersionAdapters/SynologyVersionAdapter.cs | 3 +- 29 files changed, 113 insertions(+), 80 deletions(-) diff --git a/src/Lidarr.Api.V1/Logs/LogFileController.cs b/src/Lidarr.Api.V1/Logs/LogFileController.cs index 10e72debe..f5ad69e68 100644 --- a/src/Lidarr.Api.V1/Logs/LogFileController.cs +++ b/src/Lidarr.Api.V1/Logs/LogFileController.cs @@ -25,7 +25,7 @@ namespace Lidarr.Api.V1.Logs protected override IEnumerable GetLogFiles() { - return _diskProvider.GetFiles(_appFolderInfo.GetLogFolder(), SearchOption.TopDirectoryOnly); + return _diskProvider.GetFiles(_appFolderInfo.GetLogFolder(), false); } protected override string GetLogFilePath(string filename) diff --git a/src/Lidarr.Api.V1/Logs/UpdateLogFileController.cs b/src/Lidarr.Api.V1/Logs/UpdateLogFileController.cs index b808e3c05..c6b7ec123 100644 --- a/src/Lidarr.Api.V1/Logs/UpdateLogFileController.cs +++ b/src/Lidarr.Api.V1/Logs/UpdateLogFileController.cs @@ -32,7 +32,7 @@ namespace Lidarr.Api.V1.Logs return Enumerable.Empty(); } - return _diskProvider.GetFiles(_appFolderInfo.GetUpdateLogFolder(), SearchOption.TopDirectoryOnly) + return _diskProvider.GetFiles(_appFolderInfo.GetUpdateLogFolder(), false) .Where(f => Regex.IsMatch(Path.GetFileName(f), LOGFILE_ROUTE.TrimStart('/'), RegexOptions.IgnoreCase)) .ToList(); } diff --git a/src/NzbDrone.Common.Test/DiskTests/DiskTransferServiceFixture.cs b/src/NzbDrone.Common.Test/DiskTests/DiskTransferServiceFixture.cs index c9eff67c9..44e71b12a 100644 --- a/src/NzbDrone.Common.Test/DiskTests/DiskTransferServiceFixture.cs +++ b/src/NzbDrone.Common.Test/DiskTests/DiskTransferServiceFixture.cs @@ -838,7 +838,7 @@ namespace NzbDrone.Common.Test.DiskTests // Note: never returns anything. Mocker.GetMock() - .Setup(v => v.GetFileInfos(It.IsAny(), It.IsAny())) + .Setup(v => v.GetFileInfos(It.IsAny(), It.IsAny())) .Returns(new List()); Mocker.GetMock() @@ -878,8 +878,8 @@ namespace NzbDrone.Common.Test.DiskTests .Returns(v => fileSystem.DirectoryInfo.FromDirectoryName(v).GetDirectories().ToList()); Mocker.GetMock() - .Setup(v => v.GetFileInfos(It.IsAny(), It.IsAny())) - .Returns((string v, SearchOption option) => fileSystem.DirectoryInfo.FromDirectoryName(v).GetFiles("*", option).ToList()); + .Setup(v => v.GetFileInfos(It.IsAny(), It.IsAny())) + .Returns((string v, bool recursive) => fileSystem.DirectoryInfo.FromDirectoryName(v).GetFiles("*", new EnumerationOptions { RecurseSubdirectories = recursive }).ToList()); Mocker.GetMock() .Setup(v => v.GetFileSize(It.IsAny())) diff --git a/src/NzbDrone.Common/ArchiveService.cs b/src/NzbDrone.Common/ArchiveService.cs index 4cd6f6835..800d240ab 100644 --- a/src/NzbDrone.Common/ArchiveService.cs +++ b/src/NzbDrone.Common/ArchiveService.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.IO; using ICSharpCode.SharpZipLib.Core; using ICSharpCode.SharpZipLib.GZip; @@ -11,7 +12,7 @@ namespace NzbDrone.Common public interface IArchiveService { void Extract(string compressedFile, string destination); - void CreateZip(string path, params string[] files); + void CreateZip(string path, IEnumerable files); } public class ArchiveService : IArchiveService @@ -39,7 +40,7 @@ namespace NzbDrone.Common _logger.Debug("Extraction complete."); } - public void CreateZip(string path, params string[] files) + public void CreateZip(string path, IEnumerable files) { using (var zipFile = ZipFile.Create(path)) { diff --git a/src/NzbDrone.Common/Disk/DiskProviderBase.cs b/src/NzbDrone.Common/Disk/DiskProviderBase.cs index 2cf49f1c2..dfdb6b54c 100644 --- a/src/NzbDrone.Common/Disk/DiskProviderBase.cs +++ b/src/NzbDrone.Common/Disk/DiskProviderBase.cs @@ -53,7 +53,7 @@ namespace NzbDrone.Common.Disk { CheckFolderExists(path); - var dirFiles = GetFiles(path, SearchOption.AllDirectories).ToList(); + var dirFiles = GetFiles(path, true).ToList(); if (!dirFiles.Any()) { @@ -156,11 +156,11 @@ namespace NzbDrone.Common.Disk return _fileSystem.Directory.EnumerateFileSystemEntries(path).Empty(); } - public string[] GetDirectories(string path) + public IEnumerable GetDirectories(string path) { Ensure.That(path, () => path).IsValidPath(PathValidationType.CurrentOs); - return _fileSystem.Directory.GetDirectories(path); + return _fileSystem.Directory.EnumerateDirectories(path); } public string[] GetDirectories(string path, SearchOption searchOption) @@ -170,18 +170,22 @@ namespace NzbDrone.Common.Disk return _fileSystem.Directory.GetDirectories(path, "*", searchOption); } - public string[] GetFiles(string path, SearchOption searchOption) + public IEnumerable GetFiles(string path, bool recursive) { Ensure.That(path, () => path).IsValidPath(PathValidationType.CurrentOs); - return _fileSystem.Directory.GetFiles(path, "*.*", searchOption); + return _fileSystem.Directory.EnumerateFiles(path, "*", new EnumerationOptions + { + RecurseSubdirectories = recursive, + IgnoreInaccessible = true + }); } public long GetFolderSize(string path) { Ensure.That(path, () => path).IsValidPath(PathValidationType.CurrentOs); - return GetFiles(path, SearchOption.AllDirectories).Sum(e => _fileSystem.FileInfo.FromFileName(e).Length); + return GetFiles(path, true).Sum(e => _fileSystem.FileInfo.FromFileName(e).Length); } public long GetFileSize(string path) @@ -302,8 +306,9 @@ namespace NzbDrone.Common.Disk { Ensure.That(path, () => path).IsValidPath(PathValidationType.CurrentOs); - var files = _fileSystem.Directory.GetFiles(path, "*.*", recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly); - Array.ForEach(files, RemoveReadOnly); + var files = GetFiles(path, recursive); + + files.ToList().ForEach(RemoveReadOnly); _fileSystem.Directory.Delete(path, recursive); } @@ -404,7 +409,7 @@ namespace NzbDrone.Common.Disk { Ensure.That(path, () => path).IsValidPath(PathValidationType.CurrentOs); - foreach (var file in GetFiles(path, SearchOption.TopDirectoryOnly)) + foreach (var file in GetFiles(path, false)) { DeleteFile(file); } @@ -504,13 +509,17 @@ namespace NzbDrone.Common.Disk return _fileSystem.DirectoryInfo.FromDirectoryName(path); } - public List GetFileInfos(string path, SearchOption searchOption = SearchOption.TopDirectoryOnly) + public List GetFileInfos(string path, bool recursive = false) { Ensure.That(path, () => path).IsValidPath(PathValidationType.CurrentOs); var di = _fileSystem.DirectoryInfo.FromDirectoryName(path); - return di.GetFiles("*", searchOption).ToList(); + return di.EnumerateFiles("*", new EnumerationOptions + { + RecurseSubdirectories = recursive, + IgnoreInaccessible = true + }).ToList(); } public IFileInfo GetFileInfo(string path) diff --git a/src/NzbDrone.Common/Disk/IDiskProvider.cs b/src/NzbDrone.Common/Disk/IDiskProvider.cs index a689edf0a..842a0c67a 100644 --- a/src/NzbDrone.Common/Disk/IDiskProvider.cs +++ b/src/NzbDrone.Common/Disk/IDiskProvider.cs @@ -23,8 +23,8 @@ namespace NzbDrone.Common.Disk bool FileExists(string path, StringComparison stringComparison); bool FolderWritable(string path); bool FolderEmpty(string path); - string[] GetDirectories(string path); - string[] GetFiles(string path, SearchOption searchOption); + IEnumerable GetDirectories(string path); + IEnumerable GetFiles(string path, bool recursive); long GetFolderSize(string path); long GetFileSize(string path); void CreateFolder(string path); @@ -54,7 +54,7 @@ namespace NzbDrone.Common.Disk IDirectoryInfo GetDirectoryInfo(string path); List GetDirectoryInfos(string path); IFileInfo GetFileInfo(string path); - List GetFileInfos(string path, SearchOption searchOption = SearchOption.TopDirectoryOnly); + List GetFileInfos(string path, bool recursive = false); void RemoveEmptySubfolders(string path); void SaveStream(Stream stream, string path); bool IsValidFolderPermissionMask(string mask); diff --git a/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/ScanWatchFolderFixture.cs b/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/ScanWatchFolderFixture.cs index afd403e94..e1c56ba24 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/ScanWatchFolderFixture.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/ScanWatchFolderFixture.cs @@ -30,7 +30,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole .Returns(new[] { targetDir }); Mocker.GetMock() - .Setup(c => c.GetFiles(targetDir, SearchOption.AllDirectories)) + .Setup(c => c.GetFiles(targetDir, true)) .Returns(new[] { Path.Combine(targetDir, "somefile.flac") }); Mocker.GetMock() diff --git a/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/TorrentBlackholeFixture.cs b/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/TorrentBlackholeFixture.cs index 59edf29c4..f8e3a56fa 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/TorrentBlackholeFixture.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/TorrentBlackholeFixture.cs @@ -83,7 +83,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole .Returns(new[] { targetDir }); Mocker.GetMock() - .Setup(c => c.GetFiles(targetDir, SearchOption.AllDirectories)) + .Setup(c => c.GetFiles(targetDir, true)) .Returns(new[] { Path.Combine(targetDir, "somefile.flac") }); Mocker.GetMock() diff --git a/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/UsenetBlackholeFixture.cs b/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/UsenetBlackholeFixture.cs index c51dfe8ee..6c2003976 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/UsenetBlackholeFixture.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/UsenetBlackholeFixture.cs @@ -74,7 +74,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole .Returns(new[] { targetDir }); Mocker.GetMock() - .Setup(c => c.GetFiles(targetDir, SearchOption.AllDirectories)) + .Setup(c => c.GetFiles(targetDir, true)) .Returns(new[] { Path.Combine(targetDir, "somefile.flac") }); Mocker.GetMock() diff --git a/src/NzbDrone.Core.Test/MediaFiles/DiskScanServiceTests/ScanFixture.cs b/src/NzbDrone.Core.Test/MediaFiles/DiskScanServiceTests/ScanFixture.cs index 4c6a891dd..f69185008 100644 --- a/src/NzbDrone.Core.Test/MediaFiles/DiskScanServiceTests/ScanFixture.cs +++ b/src/NzbDrone.Core.Test/MediaFiles/DiskScanServiceTests/ScanFixture.cs @@ -9,6 +9,7 @@ using FluentAssertions; using Moq; using NUnit.Framework; using NzbDrone.Common.Disk; +using NzbDrone.Common.Extensions; using NzbDrone.Core.DecisionEngine; using NzbDrone.Core.MediaFiles; using NzbDrone.Core.MediaFiles.TrackImport; @@ -66,10 +67,26 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests private void GivenRootFolder(params string[] subfolders) { + Mocker.GetMock() + .Setup(s => s.FolderExists(_rootFolder)) + .Returns(true); + + Mocker.GetMock() + .Setup(s => s.GetDirectories(_rootFolder)) + .Returns(subfolders); + + Mocker.GetMock() + .Setup(s => s.FolderEmpty(_rootFolder)) + .Returns(subfolders.Empty()); + FileSystem.AddDirectory(_rootFolder); foreach (var folder in subfolders) { + Mocker.GetMock() + .Setup(s => s.FolderExists(folder)) + .Returns(true); + FileSystem.AddDirectory(folder); } } @@ -79,7 +96,7 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests GivenRootFolder(_artist.Path); } - private List GivenFiles(IEnumerable files, DateTimeOffset? lastWrite = null) + private void GivenFiles(IEnumerable files, DateTimeOffset? lastWrite = null) { if (lastWrite == null) { @@ -92,7 +109,9 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests FileSystem.AddFile(file, new MockFileData(string.Empty) { LastWriteTime = lastWrite.Value }); } - return files.Select(x => DiskProvider.GetFileInfo(x)).ToList(); + Mocker.GetMock() + .Setup(s => s.GetFileInfos(It.IsAny(), true)) + .Returns(files.Select(x => DiskProvider.GetFileInfo(x)).ToList()); } private void GivenKnownFiles(IEnumerable files, DateTimeOffset? lastWrite = null) @@ -139,7 +158,7 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests ExceptionVerification.ExpectedWarns(1); Mocker.GetMock() - .Verify(v => v.GetFiles(_artist.Path, SearchOption.AllDirectories), Times.Never()); + .Verify(v => v.GetFiles(_artist.Path, true), Times.Never()); Mocker.GetMock() .Verify(v => v.Clean(It.IsAny(), It.IsAny>()), Times.Never()); @@ -194,6 +213,9 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests Subject.Scan(new List { _artist.Path }); + Mocker.GetMock() + .Verify(v => v.GetFileInfos(It.IsAny(), It.IsAny()), Times.Once()); + Mocker.GetMock() .Verify(v => v.GetImportDecisions(It.Is>(l => l.Count == 1), It.IsAny(), It.IsAny(), It.IsAny()), Times.Once()); } @@ -384,6 +406,8 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests [Test] public void should_insert_new_unmatched_files_when_all_new() { + GivenArtistFolder(); + var files = new List { Path.Combine(_artist.Path, "Season 1", "file1.flac"), @@ -404,6 +428,8 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests [Test] public void should_insert_new_unmatched_files_when_some_known() { + GivenArtistFolder(); + var files = new List { Path.Combine(_artist.Path, "Season 1", "file1.flac"), @@ -424,6 +450,8 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests [Test] public void should_not_insert_files_when_all_known() { + GivenArtistFolder(); + var files = new List { Path.Combine(_artist.Path, "Season 1", "file1.flac"), @@ -448,6 +476,8 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests [Test] public void should_not_update_info_for_unchanged_known_files() { + GivenArtistFolder(); + var files = new List { Path.Combine(_artist.Path, "Season 1", "file1.flac"), @@ -472,6 +502,8 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests [Test] public void should_update_info_for_changed_known_files() { + GivenArtistFolder(); + var files = new List { Path.Combine(_artist.Path, "Season 1", "file1.flac"), diff --git a/src/NzbDrone.Core.Test/ProviderTests/DiskScanProviderTests/GetAudioFilesFixture.cs b/src/NzbDrone.Core.Test/ProviderTests/DiskScanProviderTests/GetAudioFilesFixture.cs index 476562dc1..afe5b7b10 100644 --- a/src/NzbDrone.Core.Test/ProviderTests/DiskScanProviderTests/GetAudioFilesFixture.cs +++ b/src/NzbDrone.Core.Test/ProviderTests/DiskScanProviderTests/GetAudioFilesFixture.cs @@ -32,7 +32,7 @@ namespace NzbDrone.Core.Test.ProviderTests.DiskScanProviderTests }; Mocker.GetMock() - .Setup(s => s.GetFileInfos(It.IsAny(), It.IsAny())) + .Setup(s => s.GetFileInfos(It.IsAny(), It.IsAny())) .Returns(new List()); } @@ -51,7 +51,7 @@ namespace NzbDrone.Core.Test.ProviderTests.DiskScanProviderTests } Mocker.GetMock() - .Setup(s => s.GetFileInfos(It.IsAny(), SearchOption.AllDirectories)) + .Setup(s => s.GetFileInfos(It.IsAny(), true)) .Returns(filesToReturn); } @@ -60,8 +60,8 @@ namespace NzbDrone.Core.Test.ProviderTests.DiskScanProviderTests { Subject.GetAudioFiles(_path); - Mocker.GetMock().Verify(s => s.GetFileInfos(_path, SearchOption.AllDirectories), Times.Once()); - Mocker.GetMock().Verify(s => s.GetFileInfos(_path, SearchOption.TopDirectoryOnly), Times.Never()); + Mocker.GetMock().Verify(s => s.GetFileInfos(_path, true), Times.Once()); + Mocker.GetMock().Verify(s => s.GetFileInfos(_path, false), Times.Never()); } [Test] @@ -69,8 +69,8 @@ namespace NzbDrone.Core.Test.ProviderTests.DiskScanProviderTests { Subject.GetAudioFiles(_path, true); - Mocker.GetMock().Verify(s => s.GetFileInfos(_path, SearchOption.AllDirectories), Times.Once()); - Mocker.GetMock().Verify(s => s.GetFileInfos(_path, SearchOption.TopDirectoryOnly), Times.Never()); + Mocker.GetMock().Verify(s => s.GetFileInfos(_path, true), Times.Once()); + Mocker.GetMock().Verify(s => s.GetFileInfos(_path, false), Times.Never()); } [Test] @@ -78,8 +78,8 @@ namespace NzbDrone.Core.Test.ProviderTests.DiskScanProviderTests { Subject.GetAudioFiles(_path, false); - Mocker.GetMock().Verify(s => s.GetFileInfos(_path, SearchOption.AllDirectories), Times.Never()); - Mocker.GetMock().Verify(s => s.GetFileInfos(_path, SearchOption.TopDirectoryOnly), Times.Once()); + Mocker.GetMock().Verify(s => s.GetFileInfos(_path, true), Times.Never()); + Mocker.GetMock().Verify(s => s.GetFileInfos(_path, false), Times.Once()); } [Test] diff --git a/src/NzbDrone.Core.Test/ProviderTests/RecycleBinProviderTests/CleanupFixture.cs b/src/NzbDrone.Core.Test/ProviderTests/RecycleBinProviderTests/CleanupFixture.cs index 7fb282fa2..2ec41f3a4 100644 --- a/src/NzbDrone.Core.Test/ProviderTests/RecycleBinProviderTests/CleanupFixture.cs +++ b/src/NzbDrone.Core.Test/ProviderTests/RecycleBinProviderTests/CleanupFixture.cs @@ -1,5 +1,4 @@ -using System; -using System.IO; +using System; using Moq; using NUnit.Framework; using NzbDrone.Common.Disk; @@ -42,7 +41,7 @@ namespace NzbDrone.Core.Test.ProviderTests.RecycleBinProviderTests Mocker.GetMock().Setup(s => s.GetDirectories(RecycleBin)) .Returns(new[] { @"C:\Test\RecycleBin\Folder1", @"C:\Test\RecycleBin\Folder2", @"C:\Test\RecycleBin\Folder3" }); - Mocker.GetMock().Setup(s => s.GetFiles(RecycleBin, SearchOption.AllDirectories)) + Mocker.GetMock().Setup(s => s.GetFiles(RecycleBin, true)) .Returns(new[] { @"C:\Test\RecycleBin\File1.avi", @"C:\Test\RecycleBin\File2.mkv" }); } diff --git a/src/NzbDrone.Core.Test/ProviderTests/RecycleBinProviderTests/DeleteDirectoryFixture.cs b/src/NzbDrone.Core.Test/ProviderTests/RecycleBinProviderTests/DeleteDirectoryFixture.cs index 433e6f3a6..34893e233 100644 --- a/src/NzbDrone.Core.Test/ProviderTests/RecycleBinProviderTests/DeleteDirectoryFixture.cs +++ b/src/NzbDrone.Core.Test/ProviderTests/RecycleBinProviderTests/DeleteDirectoryFixture.cs @@ -1,5 +1,4 @@ -using System; -using System.IO; +using System; using Moq; using NUnit.Framework; using NzbDrone.Common.Disk; @@ -68,7 +67,7 @@ namespace NzbDrone.Core.Test.ProviderTests.RecycleBinProviderTests WithRecycleBin(); var path = @"C:\Test\TV\30 Rock".AsOsAgnostic(); - Mocker.GetMock().Setup(s => s.GetFiles(@"C:\Test\Recycle Bin\30 Rock".AsOsAgnostic(), SearchOption.AllDirectories)) + Mocker.GetMock().Setup(s => s.GetFiles(@"C:\Test\Recycle Bin\30 Rock".AsOsAgnostic(), true)) .Returns(new[] { "File1", "File2", "File3" }); Mocker.Resolve().DeleteFolder(path); diff --git a/src/NzbDrone.Core.Test/ProviderTests/RecycleBinProviderTests/EmptyFixture.cs b/src/NzbDrone.Core.Test/ProviderTests/RecycleBinProviderTests/EmptyFixture.cs index f061c1388..2b1a8ffa1 100644 --- a/src/NzbDrone.Core.Test/ProviderTests/RecycleBinProviderTests/EmptyFixture.cs +++ b/src/NzbDrone.Core.Test/ProviderTests/RecycleBinProviderTests/EmptyFixture.cs @@ -1,4 +1,3 @@ -using System.IO; using Moq; using NUnit.Framework; using NzbDrone.Common.Disk; @@ -22,7 +21,7 @@ namespace NzbDrone.Core.Test.ProviderTests.RecycleBinProviderTests Mocker.GetMock().Setup(s => s.GetDirectories(RecycleBin)) .Returns(new[] { @"C:\Test\RecycleBin\Folder1", @"C:\Test\RecycleBin\Folder2", @"C:\Test\RecycleBin\Folder3" }); - Mocker.GetMock().Setup(s => s.GetFiles(RecycleBin, SearchOption.TopDirectoryOnly)) + Mocker.GetMock().Setup(s => s.GetFiles(RecycleBin, false)) .Returns(new[] { @"C:\Test\RecycleBin\File1.avi", @"C:\Test\RecycleBin\File2.mkv" }); } diff --git a/src/NzbDrone.Core/Backup/BackupService.cs b/src/NzbDrone.Core/Backup/BackupService.cs index 4a98b8c3d..6c1431188 100644 --- a/src/NzbDrone.Core/Backup/BackupService.cs +++ b/src/NzbDrone.Core/Backup/BackupService.cs @@ -89,7 +89,7 @@ namespace NzbDrone.Core.Backup // Delete journal file created during database backup _diskProvider.DeleteFile(Path.Combine(_backupTempFolder, "lidarr.db-journal")); - _archiveService.CreateZip(backupPath, _diskProvider.GetFiles(_backupTempFolder, SearchOption.TopDirectoryOnly)); + _archiveService.CreateZip(backupPath, _diskProvider.GetFiles(_backupTempFolder, false)); Cleanup(); @@ -128,7 +128,7 @@ namespace NzbDrone.Core.Backup _archiveService.Extract(backupFileName, temporaryPath); - foreach (var file in _diskProvider.GetFiles(temporaryPath, SearchOption.TopDirectoryOnly)) + foreach (var file in _diskProvider.GetFiles(temporaryPath, false)) { var fileName = Path.GetFileName(file); @@ -237,7 +237,7 @@ namespace NzbDrone.Core.Backup private IEnumerable GetBackupFiles(string path) { - var files = _diskProvider.GetFiles(path, SearchOption.TopDirectoryOnly); + var files = _diskProvider.GetFiles(path, false); return files.Where(f => BackupFileRegex.IsMatch(f)); } diff --git a/src/NzbDrone.Core/Download/Clients/Blackhole/ScanWatchFolder.cs b/src/NzbDrone.Core/Download/Clients/Blackhole/ScanWatchFolder.cs index 42bbd50e0..a6c5f8e12 100644 --- a/src/NzbDrone.Core/Download/Clients/Blackhole/ScanWatchFolder.cs +++ b/src/NzbDrone.Core/Download/Clients/Blackhole/ScanWatchFolder.cs @@ -69,7 +69,7 @@ namespace NzbDrone.Core.Download.Clients.Blackhole if (PreCheckWatchItemExpiry(newWatchItem, oldWatchItem)) { - var files = _diskProvider.GetFiles(folder, SearchOption.AllDirectories); + var files = _diskProvider.GetFiles(folder, true); newWatchItem.TotalSize = files.Select(_diskProvider.GetFileSize).Sum(); newWatchItem.Hash = GetHash(folder, files); @@ -153,7 +153,7 @@ namespace NzbDrone.Core.Download.Clients.Blackhole } } - private string GetHash(string folder, string[] files) + private string GetHash(string folder, IEnumerable files) { var data = new StringBuilder(); diff --git a/src/NzbDrone.Core/Download/Clients/Pneumatic/Pneumatic.cs b/src/NzbDrone.Core/Download/Clients/Pneumatic/Pneumatic.cs index 46823ac10..7e9102d52 100644 --- a/src/NzbDrone.Core/Download/Clients/Pneumatic/Pneumatic.cs +++ b/src/NzbDrone.Core/Download/Clients/Pneumatic/Pneumatic.cs @@ -61,7 +61,7 @@ namespace NzbDrone.Core.Download.Clients.Pneumatic public override IEnumerable GetItems() { - foreach (var file in _diskProvider.GetFiles(Settings.StrmFolder, SearchOption.TopDirectoryOnly)) + foreach (var file in _diskProvider.GetFiles(Settings.StrmFolder, false)) { if (Path.GetExtension(file) != ".strm") { diff --git a/src/NzbDrone.Core/Extras/ExtraService.cs b/src/NzbDrone.Core/Extras/ExtraService.cs index c92837429..c86acc38a 100644 --- a/src/NzbDrone.Core/Extras/ExtraService.cs +++ b/src/NzbDrone.Core/Extras/ExtraService.cs @@ -68,7 +68,7 @@ namespace NzbDrone.Core.Extras var sourcePath = localTrack.Path; var sourceFolder = _diskProvider.GetParentFolder(sourcePath); var sourceFileName = Path.GetFileNameWithoutExtension(sourcePath); - var files = _diskProvider.GetFiles(sourceFolder, SearchOption.TopDirectoryOnly); + var files = _diskProvider.GetFiles(sourceFolder, false); var wantedExtensions = _configService.ExtraFileExtensions.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) .Select(e => e.Trim(' ', '.')) diff --git a/src/NzbDrone.Core/MediaFiles/DiskScanService.cs b/src/NzbDrone.Core/MediaFiles/DiskScanService.cs index 12f2b8f35..0c5c4ca05 100644 --- a/src/NzbDrone.Core/MediaFiles/DiskScanService.cs +++ b/src/NzbDrone.Core/MediaFiles/DiskScanService.cs @@ -237,8 +237,7 @@ namespace NzbDrone.Core.MediaFiles { _logger.Debug("Scanning '{0}' for music files", path); - var searchOption = allDirectories ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly; - var filesOnDisk = _diskProvider.GetFileInfos(path, searchOption); + var filesOnDisk = _diskProvider.GetFileInfos(path, allDirectories); var mediaFileList = filesOnDisk.Where(file => MediaFileExtensions.Extensions.Contains(file.Extension)) .ToList(); @@ -253,8 +252,7 @@ namespace NzbDrone.Core.MediaFiles { _logger.Debug("Scanning '{0}' for non-music files", path); - var searchOption = allDirectories ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly; - var filesOnDisk = _diskProvider.GetFiles(path, searchOption).ToList(); + var filesOnDisk = _diskProvider.GetFiles(path, allDirectories).ToList(); var mediaFileList = filesOnDisk.Where(file => !MediaFileExtensions.Extensions.Contains(Path.GetExtension(file))) .ToList(); diff --git a/src/NzbDrone.Core/MediaFiles/DownloadedTracksImportService.cs b/src/NzbDrone.Core/MediaFiles/DownloadedTracksImportService.cs index c9576ee31..dbe2819e8 100644 --- a/src/NzbDrone.Core/MediaFiles/DownloadedTracksImportService.cs +++ b/src/NzbDrone.Core/MediaFiles/DownloadedTracksImportService.cs @@ -116,7 +116,7 @@ namespace NzbDrone.Core.MediaFiles try { var audioFiles = _diskScanService.GetAudioFiles(directoryInfo.FullName); - var rarFiles = _diskProvider.GetFiles(directoryInfo.FullName, SearchOption.AllDirectories).Where(f => Path.GetExtension(f).Equals(".rar", StringComparison.OrdinalIgnoreCase)); + var rarFiles = _diskProvider.GetFiles(directoryInfo.FullName, true).Where(f => Path.GetExtension(f).Equals(".rar", StringComparison.OrdinalIgnoreCase)); foreach (var audioFile in audioFiles) { diff --git a/src/NzbDrone.Core/MediaFiles/MediaFileDeletionService.cs b/src/NzbDrone.Core/MediaFiles/MediaFileDeletionService.cs index 09db6b0d2..42366872d 100644 --- a/src/NzbDrone.Core/MediaFiles/MediaFileDeletionService.cs +++ b/src/NzbDrone.Core/MediaFiles/MediaFileDeletionService.cs @@ -1,5 +1,4 @@ using System; -using System.IO; using System.Linq; using System.Net; using NLog; @@ -160,11 +159,11 @@ namespace NzbDrone.Core.MediaFiles var artist = message.Album.Artist.Value; var albumFolder = message.TrackFilesToDelete.FirstOrDefault()?.Path.GetParentPath(); - if (_diskProvider.GetFiles(artist.Path, SearchOption.AllDirectories).Empty()) + if (_diskProvider.GetFiles(artist.Path, true).Empty()) { _diskProvider.DeleteFolder(artist.Path, true); } - else if (albumFolder.IsNotNullOrWhiteSpace() && _diskProvider.GetFiles(albumFolder, SearchOption.AllDirectories).Empty()) + else if (albumFolder.IsNotNullOrWhiteSpace() && _diskProvider.GetFiles(albumFolder, true).Empty()) { _diskProvider.RemoveEmptySubfolders(albumFolder); } @@ -187,11 +186,11 @@ namespace NzbDrone.Core.MediaFiles var artist = message.TrackFile.Artist.Value; var albumFolder = message.TrackFile.Path.GetParentPath(); - if (_diskProvider.GetFiles(artist.Path, SearchOption.AllDirectories).Empty()) + if (_diskProvider.GetFiles(artist.Path, true).Empty()) { _diskProvider.DeleteFolder(artist.Path, true); } - else if (_diskProvider.GetFiles(albumFolder, SearchOption.AllDirectories).Empty()) + else if (_diskProvider.GetFiles(albumFolder, true).Empty()) { _diskProvider.RemoveEmptySubfolders(albumFolder); } diff --git a/src/NzbDrone.Core/MediaFiles/RecycleBinProvider.cs b/src/NzbDrone.Core/MediaFiles/RecycleBinProvider.cs index 9e8b4320d..f327ed7ab 100644 --- a/src/NzbDrone.Core/MediaFiles/RecycleBinProvider.cs +++ b/src/NzbDrone.Core/MediaFiles/RecycleBinProvider.cs @@ -57,7 +57,7 @@ namespace NzbDrone.Core.MediaFiles _logger.Debug("Setting last accessed: {0}", path); _diskProvider.FolderSetLastWriteTime(destination, DateTime.UtcNow); - foreach (var file in _diskProvider.GetFiles(destination, SearchOption.AllDirectories)) + foreach (var file in _diskProvider.GetFiles(destination, true)) { SetLastWriteTime(file, DateTime.UtcNow); } @@ -146,7 +146,7 @@ namespace NzbDrone.Core.MediaFiles _diskProvider.DeleteFolder(folder, true); } - foreach (var file in _diskProvider.GetFiles(_configService.RecycleBin, SearchOption.TopDirectoryOnly)) + foreach (var file in _diskProvider.GetFiles(_configService.RecycleBin, false)) { _diskProvider.DeleteFile(file); } @@ -172,7 +172,7 @@ namespace NzbDrone.Core.MediaFiles _logger.Info("Removing items older than {0} days from the recycling bin", cleanupDays); - foreach (var file in _diskProvider.GetFiles(_configService.RecycleBin, SearchOption.AllDirectories)) + foreach (var file in _diskProvider.GetFiles(_configService.RecycleBin, true)) { if (_diskProvider.FileGetLastWrite(file).AddDays(cleanupDays) > DateTime.UtcNow) { diff --git a/src/NzbDrone.Core/MediaFiles/RootFolderWatchingService.cs b/src/NzbDrone.Core/MediaFiles/RootFolderWatchingService.cs index afa8fc771..76c204e1f 100644 --- a/src/NzbDrone.Core/MediaFiles/RootFolderWatchingService.cs +++ b/src/NzbDrone.Core/MediaFiles/RootFolderWatchingService.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Threading.Tasks; using NLog; using NzbDrone.Common.Disk; +using NzbDrone.Common.EnsureThat; using NzbDrone.Common.Extensions; using NzbDrone.Common.TPL; using NzbDrone.Core.Configuration; diff --git a/src/NzbDrone.Mono.Test/EnvironmentInfo/VersionAdapters/MacOsVersionAdapterFixture.cs b/src/NzbDrone.Mono.Test/EnvironmentInfo/VersionAdapters/MacOsVersionAdapterFixture.cs index b650422cd..b4df1027a 100644 --- a/src/NzbDrone.Mono.Test/EnvironmentInfo/VersionAdapters/MacOsVersionAdapterFixture.cs +++ b/src/NzbDrone.Mono.Test/EnvironmentInfo/VersionAdapters/MacOsVersionAdapterFixture.cs @@ -1,4 +1,4 @@ -using System.IO; +using System.IO; using FluentAssertions; using Moq; using NUnit.Framework; @@ -25,7 +25,7 @@ namespace NzbDrone.Mono.Test.EnvironmentInfo.VersionAdapters .Setup(c => c.FolderExists("/System/Library/CoreServices/")).Returns(true); Mocker.GetMock() - .Setup(c => c.GetFiles("/System/Library/CoreServices/", SearchOption.TopDirectoryOnly)) + .Setup(c => c.GetFiles("/System/Library/CoreServices/", false)) .Returns(new[] { plistPath }); Mocker.GetMock() @@ -49,7 +49,7 @@ namespace NzbDrone.Mono.Test.EnvironmentInfo.VersionAdapters .Setup(c => c.FolderExists("/System/Library/CoreServices/")).Returns(true); Mocker.GetMock() - .Setup(c => c.GetFiles("/System/Library/CoreServices/", SearchOption.TopDirectoryOnly)) + .Setup(c => c.GetFiles("/System/Library/CoreServices/", false)) .Returns(new[] { plistPath }); Mocker.GetMock() @@ -69,7 +69,7 @@ namespace NzbDrone.Mono.Test.EnvironmentInfo.VersionAdapters Subject.Read().Should().BeNull(); Mocker.GetMock() - .Verify(c => c.GetFiles(It.IsAny(), SearchOption.TopDirectoryOnly), Times.Never()); + .Verify(c => c.GetFiles(It.IsAny(), false), Times.Never()); } } } diff --git a/src/NzbDrone.Mono.Test/EnvironmentInfo/VersionAdapters/ReleaseFileVersionAdapterFixture.cs b/src/NzbDrone.Mono.Test/EnvironmentInfo/VersionAdapters/ReleaseFileVersionAdapterFixture.cs index 5f8dbc913..20ff6dbeb 100644 --- a/src/NzbDrone.Mono.Test/EnvironmentInfo/VersionAdapters/ReleaseFileVersionAdapterFixture.cs +++ b/src/NzbDrone.Mono.Test/EnvironmentInfo/VersionAdapters/ReleaseFileVersionAdapterFixture.cs @@ -30,25 +30,25 @@ namespace NzbDrone.Mono.Test.EnvironmentInfo.VersionAdapters } [Test] - public void should_return_null_if_etc_doestn_exist() + public void should_return_null_if_etc_doesnt_exist() { Mocker.GetMock().Setup(c => c.FolderExists("/etc/")).Returns(false); Subject.Read().Should().BeNull(); Mocker.GetMock() - .Verify(c => c.GetFiles(It.IsAny(), SearchOption.TopDirectoryOnly), Times.Never()); + .Verify(c => c.GetFiles(It.IsAny(), false), Times.Never()); Subject.Read().Should().BeNull(); } [Test] - public void should_return_null_if_release_file_doestn_exist() + public void should_return_null_if_release_file_doesnt_exist() { Mocker.GetMock().Setup(c => c.FolderExists("/etc/")).Returns(true); Subject.Read().Should().BeNull(); Mocker.GetMock() - .Setup(c => c.GetFiles(It.IsAny(), SearchOption.TopDirectoryOnly)).Returns(System.Array.Empty()); + .Setup(c => c.GetFiles(It.IsAny(), false)).Returns(System.Array.Empty()); Subject.Read().Should().BeNull(); } @@ -60,7 +60,7 @@ namespace NzbDrone.Mono.Test.EnvironmentInfo.VersionAdapters Subject.Read().Should().BeNull(); Mocker.GetMock() - .Setup(c => c.GetFiles(It.IsAny(), SearchOption.TopDirectoryOnly)).Returns(new[] + .Setup(c => c.GetFiles(It.IsAny(), false)).Returns(new[] { "/etc/lsb-release", "/etc/os-release" diff --git a/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/IssueFileVersionAdapter.cs b/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/IssueFileVersionAdapter.cs index 2965f5a1a..4113c3993 100644 --- a/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/IssueFileVersionAdapter.cs +++ b/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/IssueFileVersionAdapter.cs @@ -1,4 +1,3 @@ -using System.IO; using System.Linq; using NzbDrone.Common.Disk; using NzbDrone.Common.EnvironmentInfo; @@ -21,7 +20,7 @@ namespace NzbDrone.Mono.EnvironmentInfo.VersionAdapters return null; } - var issueFile = _diskProvider.GetFiles("/etc/", SearchOption.TopDirectoryOnly).SingleOrDefault(c => c.EndsWith("/issue")); + var issueFile = _diskProvider.GetFiles("/etc/", false).SingleOrDefault(c => c.EndsWith("/issue")); if (issueFile == null) { diff --git a/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/MacOsVersionAdapter.cs b/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/MacOsVersionAdapter.cs index 9997b25dc..867d46f2e 100644 --- a/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/MacOsVersionAdapter.cs +++ b/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/MacOsVersionAdapter.cs @@ -1,4 +1,3 @@ -using System.IO; using System.Linq; using System.Text.RegularExpressions; using NLog; @@ -34,7 +33,7 @@ namespace NzbDrone.Mono.EnvironmentInfo.VersionAdapters return null; } - var allFiles = _diskProvider.GetFiles(PLIST_DIR, SearchOption.TopDirectoryOnly); + var allFiles = _diskProvider.GetFiles(PLIST_DIR, false); var versionFile = allFiles.SingleOrDefault(c => c.EndsWith("/SystemVersion.plist") || diff --git a/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/ReleaseFileVersionAdapter.cs b/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/ReleaseFileVersionAdapter.cs index 9347176b2..77c4b9edc 100644 --- a/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/ReleaseFileVersionAdapter.cs +++ b/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/ReleaseFileVersionAdapter.cs @@ -1,4 +1,3 @@ -using System.IO; using System.Linq; using System.Text.RegularExpressions; using NzbDrone.Common.Disk; @@ -22,7 +21,7 @@ namespace NzbDrone.Mono.EnvironmentInfo.VersionAdapters return null; } - var releaseFiles = _diskProvider.GetFiles("/etc/", SearchOption.TopDirectoryOnly).Where(c => c.EndsWith("release")).ToList(); + var releaseFiles = _diskProvider.GetFiles("/etc/", false).Where(c => c.EndsWith("release")).ToList(); var name = "Linux"; var fullName = ""; diff --git a/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/SynologyVersionAdapter.cs b/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/SynologyVersionAdapter.cs index 994867527..b27c0d7e4 100644 --- a/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/SynologyVersionAdapter.cs +++ b/src/NzbDrone.Mono/EnvironmentInfo/VersionAdapters/SynologyVersionAdapter.cs @@ -1,4 +1,3 @@ -using System.IO; using System.Linq; using System.Text.RegularExpressions; using NzbDrone.Common.Disk; @@ -24,7 +23,7 @@ namespace NzbDrone.Mono.EnvironmentInfo.VersionAdapters return null; } - var versionFile = _diskProvider.GetFiles("/etc.defaults/", SearchOption.TopDirectoryOnly).SingleOrDefault(c => c.EndsWith("VERSION")); + var versionFile = _diskProvider.GetFiles("/etc.defaults/", false).SingleOrDefault(c => c.EndsWith("VERSION")); if (versionFile == null) {