Я использую elmah. Это имеет некоторые действительно хорошие функции и здесь статья CodeProject о нем. Я думаю, что команда StackOverflow использует elmah также!
Как насчет этой ссылки из MSDN , которая использует класс System.IO.DriveInfo
?
System.IO.DriveInfo работает нормально. Я подключен к двум отдельным серверам Netware с несколькими подключенными дисками.
Вот для локального диска C::
Drive C:\
File type: Fixed
Volume label: Drive C
File system: NTFS
Available space to current user: 158558248960 bytes
Total available space: 158558248960 bytes
Total size of drive: 249884004352 bytes
Вот результат для одного из сетевых дисков:
Drive F:\
File type: Network
Volume label: SYS
File system: NWFS
Available space to current user: 1840656384 bytes
Total available space: 1840656384 bytes
Total size of drive: 4124475392 bytes
Я использовал следующий код непосредственно из документации MSDN на DriveInfo:
using System; using System.IO; class Test { public static void Main() { DriveInfo[] allDrives = DriveInfo.GetDrives(); foreach (DriveInfo d in allDrives) { Console.WriteLine("Drive {0}", d.Name); Console.WriteLine(" File type: {0}", d.DriveType); if (d.IsReady == true) { Console.WriteLine(" Volume label: {0}", d.VolumeLabel); Console.WriteLine(" File system: {0}", d.DriveFormat); Console.WriteLine( " Available space to current user:{0, 15} bytes", d.AvailableFreeSpace); Console.WriteLine( " Total available space: {0, 15} bytes", d.TotalFreeSpace); Console.WriteLine( " Total size of drive: {0, 15} bytes ", d.TotalSize); } } } }
Это может не то, что вам нужно, но я пытаюсь помочь, и у него есть бонус в виде слегка безопасного стирания свободного места на вашем диске.
public static string DriveSizeAvailable(string path)
{
long count = 0;
byte toWrite = 1;
try
{
using (StreamWriter writer = new StreamWriter(path))
{
while (true)
{
writer.Write(toWrite);
count++;
}
}
}
catch (IOException)
{
}
return string.Format("There used to be {0} bytes available on drive {1}.", count, path);
}
public static string DriveSizeTotal(string path)
{
DeleteAllFiles(path);
int sizeAvailable = GetAvailableSize(path);
return string.Format("Drive {0} will hold a total of {1} bytes.", path, sizeAvailable);
}
Я почти уверен, что это невозможно. В проводнике Windows, если я попытаюсь получить свойства папки каталога UNC, это ничего не даст мне, насколько доступно доступное пространство. Используемое / доступное пространство - это характеристика дисков, а не папок, а общие ресурсы UNC рассматриваются как просто папки.
вам необходимо либо:
- Подключить диск
- Запустите что-нибудь на удаленном компьютере, чтобы проверить дисковое пространство.
Вы также можете столкнуться с проблемами с чем-то вроде распределенной файловой системы, в которой общий ресурс UNC / Mapped НЕ привязан к какому-либо конкретному диску, поэтому вам придется фактически суммировать до нескольких дисков.
А как насчет пользовательских квот? Диск может быть неполным, но учетная запись, которую вы используете для записи в эту папку, возможно, достигла своего предела.
Вы можете использовать. GetDiskFreeSpaceEx из kernel32.dll, которая работает с UNC-путями и дисками. Все, что вам нужно сделать, это включить DllImport (пример см. по ссылке).