Проблема в том, что вы устанавливаете перекрытие ваших плиток.
Вот пересмотренная и упрощенная версия ответа @sasha_gud:
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetDiskFreeSpaceEx(string lpDirectoryName,
out ulong lpFreeBytesAvailable,
out ulong lpTotalNumberOfBytes,
out ulong lpTotalNumberOfFreeBytes);
public static ulong GetDiskFreeSpace(string path)
{
if (string.IsNullOrEmpty(path))
{
throw new ArgumentNullException("path");
}
ulong dummy = 0;
if (!GetDiskFreeSpaceEx(path, out ulong freeSpace, out dummy, out dummy))
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}
return freeSpace;
}
DriveInfo поможет вам с некоторыми из них (но он не работает с путями UNC), но я думаю, что вам нужно будет использовать GetDiskFreeSpaceEx . Вероятно, вы сможете добиться некоторой функциональности с помощью WMI. GetDiskFreeSpaceEx выглядит лучшим выбором.
Скорее всего, вам придется очистить свои пути, чтобы заставить его работать правильно.
непроверено:
using System;
using System.Management;
ManagementObject disk = new
ManagementObject("win32_logicaldisk.deviceid="c:"");
disk.Get();
Console.WriteLine("Logical Disk Size = " + disk["Size"] + " bytes");
Console.WriteLine("Logical Disk FreeSpace = " + disk["FreeSpace"] + "
bytes");
Кстати, каков результат свободного дискового пространства на c: \ temp? вы освободите место от c: \