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

Closes #4147
This commit is contained in:
Mark McDowall 2023-02-16 17:05:39 -08:00
parent 37c355da51
commit 75378f7bde
3 changed files with 73 additions and 1 deletions

View File

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

View File

@ -26,6 +26,22 @@ namespace NzbDrone.Windows.Disk
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool CreateHardLink(string lpFileName, string lpExistingFileName, IntPtr lpSecurityAttributes);
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();
@ -171,5 +187,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;
}
}
}

View File

@ -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;
}
}