Skip to content

Commit 2891530

Browse files
authored
feat: Improve CopyTo directory extension to allow overwrites (#58)
* Basic implementation of overwrite within a directory copy to method * check when not overwriting to enure that partial overwrite doesn't happen * Move new argument to end of function * remove overwrite checks
1 parent a439c74 commit 2891530

File tree

3 files changed

+92
-4
lines changed

3 files changed

+92
-4
lines changed

src/System.IO.Abstractions.Extensions/IDirectoryInfoExtensions.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -199,18 +199,20 @@ public static void ForEachFile(
199199
/// </summary>
200200
/// <param name="source">Source directory</param>
201201
/// <param name="destination">Destination directory</param>
202-
/// <param name="recursive">If true the copy will be recursive and will include subfolders of <paramref name="info"/>. Defaults to false</param>
202+
/// <param name="recursive">If true the copy will be recursive and will include subfolders of <paramref name="source"/>. Defaults to false</param>
203+
/// <param name="overwrite">If true the copy will overwrite any existing files in <paramref name="destination"/>. Defaults to false</param>
203204
/// <param name="filesSearchPattern">Search pattern to apply when searching files, defaults to '*'</param>
204205
/// <param name="directoriesSearchPattern">Search pattern to apply when searching directories, defaults to '*'</param>
205206
public static void CopyTo(
206207
this IDirectoryInfo source,
207208
IDirectoryInfo destination,
208209
bool recursive = false,
209210
string filesSearchPattern = "*",
210-
string directoriesSearchPattern = "*")
211+
string directoriesSearchPattern = "*",
212+
bool overwrite = false)
211213
{
212214
source.ForEachFile(
213-
(file, destDir) => file.CopyTo(destDir.GetFilePath(file.Name)),
215+
(file, destDir) => file.CopyTo(destDir.GetFilePath(file.Name), overwrite),
214216
subDirectory => source.TranslatePaths(subDirectory, destination, true),
215217
recursive,
216218
filesSearchPattern,

tests/System.IO.Abstractions.Extensions.Tests/DirectoryInfoExtensionsTests.cs

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -388,5 +388,91 @@ public void CopyTo_TargetDirAndParentDoesNotExist_CreatesTargetDirectoryHierarch
388388

389389
Assert.IsFalse(fs.File.Exists(workingDir.FullName));
390390
}
391+
392+
[Test]
393+
public void CopyTo_Overwrite_OverwritesWhenSet()
394+
{
395+
//arrange
396+
var fs = new FileSystem();
397+
var workingDir = fs.DirectoryInfo.New(fs.Directory.GetCurrentDirectory()).CreateSubdirectory(Guid.NewGuid().ToString());
398+
399+
//create directories
400+
var source = fs.DirectoryInfo.New(fs.Path.Combine(workingDir.FullName, "SourceDir"));
401+
var dest = fs.DirectoryInfo.New(fs.Path.Combine(workingDir.FullName, "DestDir"));
402+
403+
source.Create();
404+
dest.Create();
405+
406+
//create files
407+
var sourceFile = fs.FileInfo.New(fs.Path.Combine(source.FullName, "file.txt"));
408+
var destFile = fs.FileInfo.New(fs.Path.Combine(dest.FullName, "file.txt"));
409+
410+
var sourceFileContent = new[] { nameof(sourceFile) };
411+
sourceFile.WriteLines(sourceFileContent);
412+
var destFileContent = new[] { nameof(destFile) };
413+
destFile.WriteLines(destFileContent);
414+
415+
//make sure everything is set up as expected
416+
Assert.IsTrue(fs.Directory.Exists(source.FullName));
417+
Assert.IsTrue(fs.File.Exists(sourceFile.FullName));
418+
Assert.AreEqual(fs.File.ReadAllLines(sourceFile.FullName), sourceFileContent);
419+
Assert.IsTrue(fs.Directory.Exists(dest.FullName));
420+
Assert.IsTrue(fs.File.Exists(destFile.FullName));
421+
Assert.AreEqual(fs.File.ReadAllLines(destFile.FullName), destFileContent);
422+
423+
//act
424+
source.CopyTo(dest, overwrite: true);
425+
426+
//assert
427+
Assert.AreEqual(fs.File.ReadAllLines(destFile.FullName), sourceFileContent);
428+
429+
//cleanup
430+
workingDir.Delete(recursive: true);
431+
432+
Assert.IsFalse(fs.File.Exists(workingDir.FullName));
433+
}
434+
435+
[Test]
436+
public void CopyTo_Overwrite_DoesNotOverwritesWhenNotSet()
437+
{
438+
//arrange
439+
var fs = new FileSystem();
440+
var workingDir = fs.DirectoryInfo.New(fs.Directory.GetCurrentDirectory()).CreateSubdirectory(Guid.NewGuid().ToString());
441+
442+
//create directories
443+
var source = fs.DirectoryInfo.New(fs.Path.Combine(workingDir.FullName, "SourceDir"));
444+
var dest = fs.DirectoryInfo.New(fs.Path.Combine(workingDir.FullName, "DestDir"));
445+
446+
source.Create();
447+
dest.Create();
448+
449+
//create files
450+
var sourceFile = fs.FileInfo.New(fs.Path.Combine(source.FullName, "file.txt"));
451+
var destFile = fs.FileInfo.New(fs.Path.Combine(dest.FullName, "file.txt"));
452+
453+
var sourceFileContent = new[] { nameof(sourceFile) };
454+
sourceFile.WriteLines(sourceFileContent);
455+
var destFileContent = new[] { nameof(destFile) };
456+
destFile.WriteLines(destFileContent);
457+
458+
//make sure everything is set up as expected
459+
Assert.IsTrue(fs.Directory.Exists(source.FullName));
460+
Assert.IsTrue(fs.File.Exists(sourceFile.FullName));
461+
Assert.AreEqual(fs.File.ReadAllLines(sourceFile.FullName), sourceFileContent);
462+
Assert.IsTrue(fs.Directory.Exists(dest.FullName));
463+
Assert.IsTrue(fs.File.Exists(destFile.FullName));
464+
Assert.AreEqual(fs.File.ReadAllLines(destFile.FullName), destFileContent);
465+
466+
//act
467+
Assert.That(() => source.CopyTo(dest, overwrite: false), Throws.Exception.TypeOf<IOException>().And.Message.Contains(destFile.FullName));
468+
469+
//assert
470+
Assert.AreEqual(fs.File.ReadAllLines(destFile.FullName), destFileContent);
471+
472+
//cleanup
473+
workingDir.Delete(recursive: true);
474+
475+
Assert.IsFalse(fs.File.Exists(workingDir.FullName));
476+
}
391477
}
392478
}

version.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"$schema": "https://raw.githubusercontent.com/AArnott/Nerdbank.GitVersioning/master/src/NerdBank.GitVersioning/version.schema.json",
3-
"version": "2.1",
3+
"version": "2.2",
44
"assemblyVersion": {
55
"precision": "major"
66
},

0 commit comments

Comments
 (0)