Fixed: USB drives mounted to folders are treated as different mounts

Closes #3368

(cherry picked from commit 75378f7bde90b9d3d9b72404c25c017da2cd147c)
pull/3338/head
Mark McDowall 1 year ago committed by Qstick
parent 8228f11345
commit eab4134434

@ -360,7 +360,7 @@ namespace NzbDrone.Common.Disk
}
}
public string GetPathRoot(string path)
public virtual string GetPathRoot(string path)
{
Ensure.That(path, () => path).IsValidPath();

@ -37,6 +37,22 @@ namespace NzbDrone.Windows.Disk
{
}
public override IMount GetMount(string path)
{
var reparsePoint = GetReparsePoint(path);
return reparsePoint ?? base.GetMount(path);
}
public override string GetPathRoot(string path)
{
Ensure.That(path, () => path).IsValidPath();
var reparsePoint = GetReparsePoint(path);
return reparsePoint?.RootDirectory ?? base.GetPathRoot(path);
}
public override long? GetAvailableSpace(string path)
{
Ensure.That(path, () => path).IsValidPath();
@ -182,5 +198,23 @@ namespace NzbDrone.Windows.Disk
return false;
}
}
private IMount GetReparsePoint(string path)
{
var di = new DirectoryInfo(path);
var isReparsePoint = di.Attributes.HasFlag(FileAttributes.ReparsePoint);
while (!isReparsePoint && (di = di.Parent) != null)
{
isReparsePoint = di.Attributes.HasFlag(FileAttributes.ReparsePoint);
}
if (isReparsePoint)
{
return new FolderMount(di);
}
return null;
}
}
}

@ -0,0 +1,38 @@
using System.IO;
using NzbDrone.Common.Disk;
using NzbDrone.Common.Extensions;
namespace NzbDrone.Windows.Disk
{
public class FolderMount : IMount
{
private readonly DirectoryInfo _directoryInfo;
public FolderMount(DirectoryInfo directoryInfo)
{
_directoryInfo = directoryInfo;
}
public long AvailableFreeSpace => 0;
public string DriveFormat => "NTFS";
public DriveType DriveType => DriveType.Removable;
public bool IsReady => true;
public MountOptions MountOptions { get; private set; }
public string Name => _directoryInfo.Name;
public string RootDirectory => _directoryInfo.FullName;
public long TotalFreeSpace => 0;
public long TotalSize => 0;
public string VolumeLabel => _directoryInfo.Name;
public string VolumeName => Name;
}
}
Loading…
Cancel
Save