diff --git a/NzbDrone.Core.Test/FluentTest.cs b/NzbDrone.Core.Test/FluentTest.cs index 3131f4c63..1dfad5103 100644 --- a/NzbDrone.Core.Test/FluentTest.cs +++ b/NzbDrone.Core.Test/FluentTest.cs @@ -1,5 +1,6 @@ using System; using System.IO; +using System.Linq; using System.Net; using System.ServiceModel.Syndication; using AutoMoq; @@ -91,5 +92,13 @@ namespace NzbDrone.Core.Test Console.WriteLine(dateTime.DayOfWeek); dateTime.ToBestDateString().Should().Be(dateTime.ToShortDateString()); } + + [Test] + public void FreeDiskSpace() + { + //Checks to ensure that the free space on the first is greater than 0 (It should be in 99.99999999999999% of cases... I hope) + var di = DriveInfo.GetDrives().First().RootDirectory; + di.FreeDiskSpace().Should().BeGreaterThan(0); + } } } diff --git a/NzbDrone.Core/Fluent.cs b/NzbDrone.Core/Fluent.cs index 2a36a393f..112249cd3 100644 --- a/NzbDrone.Core/Fluent.cs +++ b/NzbDrone.Core/Fluent.cs @@ -1,11 +1,20 @@ using System; using System.Collections.Generic; +using System.IO; +using System.Runtime.InteropServices; using System.Text; namespace NzbDrone.Core { public static class Fluent { + [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)] + [return: MarshalAs(UnmanagedType.Bool)] + static extern bool GetDiskFreeSpaceEx(string lpDirectoryName, + out ulong lpFreeBytesAvailable, + out ulong lpTotalNumberOfBytes, + out ulong lpTotalNumberOfFreeBytes); + public static string WithDefault(this string actual, object defaultValue) { if (defaultValue == null) @@ -18,7 +27,6 @@ namespace NzbDrone.Core return actual; } - public static Int64 Megabytes(this int megabytes) { return megabytes * 1048576L; @@ -45,5 +53,19 @@ namespace NzbDrone.Core return dateTime.ToShortDateString(); } + + public static ulong FreeDiskSpace(this DirectoryInfo directoryInfo) + { + ulong freeBytesAvailable; + ulong totalNumberOfBytes; + ulong totalNumberOfFreeBytes; + + bool success = GetDiskFreeSpaceEx(directoryInfo.FullName, out freeBytesAvailable, out totalNumberOfBytes, + out totalNumberOfFreeBytes); + if (!success) + throw new System.ComponentModel.Win32Exception(); + + return freeBytesAvailable; + } } }