diff --git a/src/NzbDrone.Common.Test/DiskTests/DiskTransferServiceFixture.cs b/src/NzbDrone.Common.Test/DiskTests/DiskTransferServiceFixture.cs index a2c3ca314..d6c4faece 100644 --- a/src/NzbDrone.Common.Test/DiskTests/DiskTransferServiceFixture.cs +++ b/src/NzbDrone.Common.Test/DiskTests/DiskTransferServiceFixture.cs @@ -16,6 +16,7 @@ namespace NzbDrone.Common.Test.DiskTests private readonly string _targetPath = @"C:\target\my.video.mkv".AsOsAgnostic(); private readonly string _backupPath = @"C:\source\my.video.mkv.backup~".AsOsAgnostic(); private readonly string _tempTargetPath = @"C:\target\my.video.mkv.partial~".AsOsAgnostic(); + private readonly string _nfsFile = ".nfs01231232"; [SetUp] public void SetUp() @@ -642,6 +643,21 @@ namespace NzbDrone.Common.Test.DiskTests VerifyCopyFolder(source.FullName, destination.FullName); } + [Test] + public void CopyFolder_should_ignore_nfs_temp_file() + { + WithRealDiskProvider(); + + var source = GetFilledTempFolder(); + + File.WriteAllText(Path.Combine(source.FullName, _nfsFile), "SubFile1"); + + var destination = new DirectoryInfo(GetTempFilePath()); + + Subject.TransferFolder(source.FullName, destination.FullName, TransferMode.Copy); + + File.Exists(Path.Combine(destination.FullName, _nfsFile)).Should().BeFalse(); + } [Test] public void MoveFolder_should_move_folder() @@ -704,6 +720,26 @@ namespace NzbDrone.Common.Test.DiskTests destination.GetFileSystemInfos().Should().BeEmpty(); } + [Test] + public void MirrorFolder_should_not_remove_nfs_files() + { + WithRealDiskProvider(); + + var original = GetFilledTempFolder(); + var source = new DirectoryInfo(GetTempFilePath()); + var destination = new DirectoryInfo(GetTempFilePath()); + + source.Create(); + Subject.TransferFolder(original.FullName, destination.FullName, TransferMode.Copy); + + File.WriteAllText(Path.Combine(destination.FullName, _nfsFile), "SubFile1"); + + var count = Subject.MirrorFolder(source.FullName, destination.FullName); + + count.Should().Equals(0); + destination.GetFileSystemInfos().Should().HaveCount(1); + } + [Test] public void MirrorFolder_should_add_new_files() { @@ -721,6 +757,24 @@ namespace NzbDrone.Common.Test.DiskTests VerifyCopyFolder(original.FullName, destination.FullName); } + [Test] + public void MirrorFolder_should_ignore_nfs_temp_file() + { + WithRealDiskProvider(); + + var source = GetFilledTempFolder(); + + File.WriteAllText(Path.Combine(source.FullName, _nfsFile), "SubFile1"); + + var destination = new DirectoryInfo(GetTempFilePath()); + + var count = Subject.MirrorFolder(source.FullName, destination.FullName); + + count.Should().Equals(3); + + File.Exists(Path.Combine(destination.FullName, _nfsFile)).Should().BeFalse(); + } + [Test] public void MirrorFolder_should_not_touch_equivalent_files() { diff --git a/src/NzbDrone.Common/Disk/DiskTransferService.cs b/src/NzbDrone.Common/Disk/DiskTransferService.cs index 8e7a05fe7..3f93c11e4 100644 --- a/src/NzbDrone.Common/Disk/DiskTransferService.cs +++ b/src/NzbDrone.Common/Disk/DiskTransferService.cs @@ -64,11 +64,15 @@ namespace NzbDrone.Common.Disk foreach (var subDir in _diskProvider.GetDirectoryInfos(sourcePath)) { + if (ShouldIgnore(subDir)) continue; + result &= TransferFolder(subDir.FullName, Path.Combine(targetPath, subDir.Name), mode, verificationMode); } foreach (var sourceFile in _diskProvider.GetFileInfos(sourcePath)) { + if (ShouldIgnore(sourceFile)) continue; + var destFile = Path.Combine(targetPath, sourceFile.Name); result &= TransferFile(sourceFile.FullName, destFile, mode, true, verificationMode); @@ -101,11 +105,15 @@ namespace NzbDrone.Common.Disk foreach (var subDir in targetFolders.Where(v => !sourceFolders.Any(d => d.Name == v.Name))) { + if (ShouldIgnore(subDir)) continue; + _diskProvider.DeleteFolder(subDir.FullName, true); } foreach (var subDir in sourceFolders) { + if (ShouldIgnore(subDir)) continue; + filesCopied += MirrorFolder(subDir.FullName, Path.Combine(targetPath, subDir.Name)); } @@ -114,11 +122,15 @@ namespace NzbDrone.Common.Disk foreach (var targetFile in targetFiles.Where(v => !sourceFiles.Any(d => d.Name == v.Name))) { + if (ShouldIgnore(targetFile)) continue; + _diskProvider.DeleteFile(targetFile.FullName); } foreach (var sourceFile in sourceFiles) { + if (ShouldIgnore(sourceFile)) continue; + var targetFile = Path.Combine(targetPath, sourceFile.Name); if (CompareFiles(sourceFile.FullName, targetFile)) @@ -564,5 +576,27 @@ namespace NzbDrone.Common.Disk throw; } } + + private bool ShouldIgnore(DirectoryInfo folder) + { + if (folder.Name.StartsWith(".nfs")) + { + _logger.Trace("Ignoring folder {0}", folder.FullName); + return true; + } + + return false; + } + + private bool ShouldIgnore(FileInfo file) + { + if (file.Name.StartsWith(".nfs")) + { + _logger.Trace("Ignoring file {0}", file.FullName); + return true; + } + + return false; + } } }