diff --git a/src/NzbDrone.Common/Disk/DiskProviderBase.cs b/src/NzbDrone.Common/Disk/DiskProviderBase.cs index 169f1a67d..29de0c1a6 100644 --- a/src/NzbDrone.Common/Disk/DiskProviderBase.cs +++ b/src/NzbDrone.Common/Disk/DiskProviderBase.cs @@ -351,7 +351,7 @@ namespace NzbDrone.Common.Disk } } - public string GetPathRoot(string path) + public virtual string GetPathRoot(string path) { Ensure.That(path, () => path).IsValidPath(); diff --git a/src/NzbDrone.Windows/Disk/DiskProvider.cs b/src/NzbDrone.Windows/Disk/DiskProvider.cs index d8b9dc448..3200e669b 100644 --- a/src/NzbDrone.Windows/Disk/DiskProvider.cs +++ b/src/NzbDrone.Windows/Disk/DiskProvider.cs @@ -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; + } } } diff --git a/src/NzbDrone.Windows/Disk/FolderMount.cs b/src/NzbDrone.Windows/Disk/FolderMount.cs new file mode 100644 index 000000000..65fbcf5de --- /dev/null +++ b/src/NzbDrone.Windows/Disk/FolderMount.cs @@ -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; + } +}