Fixed: Renaming Episodes will never overwrite existing files.

This commit is contained in:
Taloth Saldono 2014-07-31 00:00:55 +02:00 committed by Mark McDowall
parent 125e69da6d
commit e5e00fd346
5 changed files with 41 additions and 10 deletions

View File

@ -63,7 +63,7 @@ namespace NzbDrone.Common.Test.DiskProviderTests
File.WriteAllText(source2, "SourceFile2");
Subject.MoveFile(source1, destination);
Subject.MoveFile(source2, destination);
Subject.MoveFile(source2, destination, true);
File.Exists(destination).Should().BeTrue();
}
@ -75,7 +75,7 @@ namespace NzbDrone.Common.Test.DiskProviderTests
File.WriteAllText(source, "SourceFile1");
Subject.MoveFile(source, source);
Subject.MoveFile(source, source, true);
File.Exists(source).Should().BeTrue();
ExceptionVerification.ExpectedWarns(1);
@ -148,7 +148,7 @@ namespace NzbDrone.Common.Test.DiskProviderTests
File.SetAttributes(source, FileAttributes.ReadOnly);
File.SetAttributes(destination, FileAttributes.ReadOnly);
Subject.MoveFile(source, destination);
Subject.MoveFile(source, destination, true);
}
[Test]

View File

@ -220,7 +220,7 @@ namespace NzbDrone.Common.Disk
}
case TransferAction.Move:
{
MoveFile(sourceFile.FullName, destFile);
MoveFile(sourceFile.FullName, destFile, true);
break;
}
}
@ -251,7 +251,7 @@ namespace NzbDrone.Common.Disk
File.Copy(source, destination, overwrite);
}
public void MoveFile(string source, string destination)
public void MoveFile(string source, string destination, bool overwrite = false)
{
Ensure.That(source, () => source).IsValidPath();
Ensure.That(destination, () => destination).IsValidPath();
@ -262,7 +262,7 @@ namespace NzbDrone.Common.Disk
return;
}
if (FileExists(destination))
if (FileExists(destination) && overwrite)
{
DeleteFile(destination);
}

View File

@ -29,7 +29,7 @@ namespace NzbDrone.Common.Disk
void MoveFolder(string source, string destination);
void DeleteFile(string path);
void CopyFile(string source, string destination, bool overwrite = false);
void MoveFile(string source, string destination);
void MoveFile(string source, string destination, bool overwrite = false);
void DeleteFolder(string path, bool recursive);
string ReadAllText(string filePath);
void WriteAllText(string filename, string contents);

View File

@ -47,7 +47,23 @@ namespace NzbDrone.Core.Test.ProviderTests.RecycleBinProviderTests
Mocker.Resolve<RecycleBinProvider>().DeleteFile(path);
Mocker.GetMock<IDiskProvider>().Verify(v => v.MoveFile(path, @"C:\Test\Recycle Bin\S01E01.avi".AsOsAgnostic()), Times.Once());
Mocker.GetMock<IDiskProvider>().Verify(v => v.MoveFile(path, @"C:\Test\Recycle Bin\S01E01.avi".AsOsAgnostic(), true), Times.Once());
}
[Test]
public void should_use_alternative_name_if_already_exists()
{
WithRecycleBin();
var path = @"C:\Test\TV\30 Rock\S01E01.avi".AsOsAgnostic();
Mocker.GetMock<IDiskProvider>()
.Setup(v => v.FileExists(@"C:\Test\Recycle Bin\S01E01.avi".AsOsAgnostic()))
.Returns(true);
Mocker.Resolve<RecycleBinProvider>().DeleteFile(path);
Mocker.GetMock<IDiskProvider>().Verify(v => v.MoveFile(path, @"C:\Test\Recycle Bin\S01E01_2.avi".AsOsAgnostic(), true), Times.Once());
}
[Test]

View File

@ -84,10 +84,25 @@ namespace NzbDrone.Core.MediaFiles
else
{
var destination = Path.Combine(recyclingBin, new FileInfo(path).Name);
var fileInfo = new FileInfo(path);
var destination = Path.Combine(recyclingBin, fileInfo.Name);
var index = 1;
while (_diskProvider.FileExists(destination))
{
index++;
if (fileInfo.Extension.IsNullOrWhiteSpace())
{
destination = Path.Combine(recyclingBin, fileInfo.Name + "_" + index);
}
else
{
destination = Path.Combine(recyclingBin, Path.GetFileNameWithoutExtension(fileInfo.Name) + "_" + index + fileInfo.Extension);
}
}
logger.Debug("Moving '{0}' to '{1}'", path, destination);
_diskProvider.MoveFile(path, destination);
_diskProvider.MoveFile(path, destination, true);
_diskProvider.FileSetLastWriteTimeUtc(destination, DateTime.UtcNow);
logger.Debug("File has been moved to the recycling bin: {0}", destination);
}