Fixed: Directory not empty exception deleting nested empty subdirs (#974)

pull/976/head
ta264 5 years ago committed by GitHub
parent 31cb5fe523
commit 254a8ce64c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -122,6 +122,21 @@ namespace NzbDrone.Common.Test.DiskTests
Directory.Exists(sourceDir).Should().BeFalse(); Directory.Exists(sourceDir).Should().BeFalse();
} }
[Test]
public void should_be_able_to_delete_nested_empty_subdirs()
{
var artistDir = Path.Combine(GetTempFilePath(), "Artist");
var albumDir = Path.Combine(artistDir, "Album");
Directory.CreateDirectory(Path.Combine(albumDir));
Directory.CreateDirectory(Path.Combine(albumDir, "Album"));
Directory.CreateDirectory(Path.Combine(albumDir, "Album", "CD1"));
Directory.CreateDirectory(Path.Combine(albumDir, "Album", "CD2"));
Subject.RemoveEmptySubfolders(artistDir);
Directory.Exists(albumDir).Should().BeFalse();
}
[Test] [Test]
public void empty_folder_should_return_folder_modified_date() public void empty_folder_should_return_folder_modified_date()
{ {

@ -154,6 +154,13 @@ namespace NzbDrone.Common.Disk
return _fileSystem.Directory.GetDirectories(path); return _fileSystem.Directory.GetDirectories(path);
} }
public string[] GetDirectories(string path, SearchOption searchOption)
{
Ensure.That(path, () => path).IsValidPath();
return _fileSystem.Directory.GetDirectories(path, "*", searchOption);
}
public string[] GetFiles(string path, SearchOption searchOption) public string[] GetFiles(string path, SearchOption searchOption)
{ {
Ensure.That(path, () => path).IsValidPath(); Ensure.That(path, () => path).IsValidPath();
@ -500,10 +507,11 @@ namespace NzbDrone.Common.Disk
public void RemoveEmptySubfolders(string path) public void RemoveEmptySubfolders(string path)
{ {
var subfolders = GetDirectories(path); var subfolders = GetDirectories(path, SearchOption.AllDirectories);
var files = GetFiles(path, SearchOption.AllDirectories); var files = GetFiles(path, SearchOption.AllDirectories);
foreach (var subfolder in subfolders) // By sorting by length descending we ensure we always delete children before parents
foreach (var subfolder in subfolders.OrderByDescending(x => x.Length))
{ {
if (files.None(f => subfolder.IsParentPath(f))) if (files.None(f => subfolder.IsParentPath(f)))
{ {

Loading…
Cancel
Save