diff --git a/src/NzbDrone.Common.Test/DiskTests/DiskProviderFixtureBase.cs b/src/NzbDrone.Common.Test/DiskTests/DiskProviderFixtureBase.cs index c81aefbd8..bdca59161 100644 --- a/src/NzbDrone.Common.Test/DiskTests/DiskProviderFixtureBase.cs +++ b/src/NzbDrone.Common.Test/DiskTests/DiskProviderFixtureBase.cs @@ -80,6 +80,23 @@ public void MoveFile_should_overwrite_existing_file() File.Exists(destination).Should().BeTrue(); } + [Test] + [Retry(5)] + public void MoveFile_should_not_overwrite_existing_file() + { + var source1 = GetTempFilePath(); + var source2 = GetTempFilePath(); + var destination = GetTempFilePath(); + + File.WriteAllText(source1, "SourceFile1"); + File.WriteAllText(source2, "SourceFile2"); + + Subject.MoveFile(source1, destination); + Assert.Throws(() => Subject.MoveFile(source2, destination, false)); + + File.ReadAllText(destination).Should().Be("SourceFile1"); + } + [Test] public void MoveFile_should_not_move_overwrite_itself() { diff --git a/src/NzbDrone.Common/Disk/DiskProviderBase.cs b/src/NzbDrone.Common/Disk/DiskProviderBase.cs index cd63867eb..0cef181fc 100644 --- a/src/NzbDrone.Common/Disk/DiskProviderBase.cs +++ b/src/NzbDrone.Common/Disk/DiskProviderBase.cs @@ -218,13 +218,18 @@ public void MoveFile(string source, string destination, bool overwrite = false) throw new IOException(string.Format("Source and destination can't be the same {0}", source)); } - if (FileExists(destination) && overwrite) + var destExists = FileExists(destination); + + if (destExists && overwrite) { DeleteFile(destination); } RemoveReadOnly(source); - MoveFileInternal(source, destination); + + // NET Core is too eager to copy/delete if overwrite is false + // Therefore we also set overwrite if we know destination doesn't exist + MoveFileInternal(source, destination, overwrite || !destExists); } public void MoveFolder(string source, string destination, bool overwrite = false) @@ -246,9 +251,13 @@ public void MoveFolder(string source, string destination, bool overwrite = false Directory.Move(source, destination); } - protected virtual void MoveFileInternal(string source, string destination) + protected virtual void MoveFileInternal(string source, string destination, bool overwrite) { +#if NETCOREAPP + File.Move(source, destination, overwrite); +#else File.Move(source, destination); +#endif } public abstract bool TryCreateHardLink(string source, string destination); diff --git a/src/NzbDrone.Mono/Disk/DiskProvider.cs b/src/NzbDrone.Mono/Disk/DiskProvider.cs index d0ebd17b6..7d5f91d20 100644 --- a/src/NzbDrone.Mono/Disk/DiskProvider.cs +++ b/src/NzbDrone.Mono/Disk/DiskProvider.cs @@ -151,7 +151,7 @@ protected override void CopyFileInternal(string source, string destination, bool } } - protected override void MoveFileInternal(string source, string destination) + protected override void MoveFileInternal(string source, string destination, bool overwrite) { var sourceInfo = UnixFileSystemInfo.GetFileSystemEntry(source); @@ -188,7 +188,7 @@ protected override void MoveFileInternal(string source, string destination) } else { - base.MoveFileInternal(source, destination); + base.MoveFileInternal(source, destination, overwrite); } }