drive.TotalFreeSpaceу меня не работает, но drive.AvailableFreeSpaceработает
knocte
16
Я знаю, что это древний ответ, но вам обычно нужно использовать, AvailableFreeSpaceкак говорит @knocte. AvailableFreeSpaceперечисляет, сколько фактически доступно для пользователя (из-за кавычек). TotalFreeSpaceперечисляет то, что доступно на диске, независимо от того, что пользователь может использовать.
Рой Т.
Я поддержал комментарий @RoyT, потому что он нашел время, чтобы объяснить, почему один рекомендуется над другим.
SoCalCoder
41
Фрагмент рабочего кода с использованием GetDiskFreeSpaceExссылки от RichardOD.
// Pinvoke for API function
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
publicstaticexternboolGetDiskFreeSpaceEx(string lpDirectoryName,
outulong lpFreeBytesAvailable,
outulong lpTotalNumberOfBytes,
outulong lpTotalNumberOfFreeBytes);
publicstaticboolDriveFreeBytes(string folderName, outulong freespace)
{
freespace = 0;
if (string.IsNullOrEmpty(folderName))
{
thrownew ArgumentNullException("folderName");
}
if (!folderName.EndsWith("\\"))
{
folderName += '\\';
}
ulong free = 0, dummy1 = 0, dummy2 = 0;
if (GetDiskFreeSpaceEx(folderName, out free, out dummy1, out dummy2))
{
freespace = free;
returntrue;
}
else
{
returnfalse;
}
}
Я бы предпочел вернуть его пустым, вроде ... if (!GetDiskFreeSpaceEx(folderName, out free, out total, out dummy)) throw new Win32Exception(Marshal.GetLastWin32Error());. В любом случае здесь довольно удобно найти код.
Евгений Рябцев
2
Просто проверяю, но я думаю, что «CameraStorageFileHelper» - это артефакт из этого кода, скопированного с оригинала?
Эндрю Текен
Необязательно заканчивать "\\". Это может быть любой существующий путь к каталогу или даже просто C:. Вот моя версия этого кода: stackoverflow.com/a/58005966/964478
Alex P.
40
DriveInfo поможет вам с некоторыми из них (но он не работает с путями UNC), но на самом деле я думаю, вам нужно будет использовать GetDiskFreeSpaceEx . Вероятно, вы сможете добиться некоторой функциональности с помощью WMI. GetDiskFreeSpaceEx выглядит лучшим выбором.
Скорее всего, вам придется очистить свои пути, чтобы заставить его работать правильно.
using System;
using System.IO;
classTest
{
publicstaticvoidMain()
{
DriveInfo[] allDrives = DriveInfo.GetDrives();
foreach (DriveInfo d in allDrives)
{
Console.WriteLine("Drive {0}", d.Name);
Console.WriteLine(" Drive 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);
}
}
}
}
/*
This code produces output similar to the following:
Drive A:\
Drive type: Removable
Drive C:\
Drive type: Fixed
Volume label:
File system: FAT32
Available space to current user: 4770430976 bytes
Total available space: 4770430976 bytes
Total size of drive: 10731683840 bytes
Drive D:\
Drive type: Fixed
Volume label:
File system: NTFS
Available space to current user: 15114977280 bytes
Total available space: 15114977280 bytes
Total size of drive: 25958948864 bytes
Drive E:\
Drive type: CDRom
The actual output of this code will vary based on machine and the permissions
granted to the user executing it.
*/
Хотя этот код действительно работает для всех дисков в системе, он не отвечает требованиям OP для точек монтирования, точек соединения и общих ресурсов ...
Адриан Хам,
3
непроверенный:
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: \
Как говорит Кенни, свободное пространство для любого данного каталога не обязательно совпадает со свободным пространством на диске корневого каталога. Конечно, нет на моей машине.
Барри Келли
3
Вот отредактированная и упрощенная версия ответа @sasha_gud:
Я думал, что любой может вычислить ГБ, имея байты, но вы показали, что это неверное предположение. Этот код неверен, поскольку деление использует, longно функция возвращает double.
Qwertiy
2
Как предлагает этот ответ и @RichardOD, вы должны сделать следующее:
[DllImport("kernel32.dll", SetLastError=true, CharSet=CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
staticexternboolGetDiskFreeSpaceEx(string lpDirectoryName,
outulong lpFreeBytesAvailable,
outulong lpTotalNumberOfBytes,
outulong lpTotalNumberOfFreeBytes);
ulong FreeBytesAvailable;
ulong TotalNumberOfBytes;
ulong TotalNumberOfFreeBytes;
bool success = GetDiskFreeSpaceEx(@"\\mycomputer\myfolder",
out FreeBytesAvailable,
out TotalNumberOfBytes,
out TotalNumberOfFreeBytes);
if(!success)
thrownew System.ComponentModel.Win32Exception();
Console.WriteLine("Free Bytes Available: {0,15:D}", FreeBytesAvailable);
Console.WriteLine("Total Number Of Bytes: {0,15:D}", TotalNumberOfBytes);
Console.WriteLine("Total Number Of FreeBytes: {0,15:D}", TotalNumberOfFreeBytes);
Мне нужен был аналогичный метод для моего проекта, но в моем случае входные пути были либо с локальных дисковых томов, либо с кластерных томов хранения (CSV). Так что класс DriveInfo у меня не работал. CSV-файлы имеют точку монтирования на другом диске, обычно это C: \ ClusterStorage \ Volume *. Обратите внимание, что C: будет другим томом, чем C: \ ClusterStorage \ Volume1
Вот что я наконец придумал:
publicstaticulongGetFreeSpaceOfPathInBytes(string path)
{
if ((new Uri(path)).IsUnc)
{
thrownew NotImplementedException("Cannot find free space for UNC path " + path);
}
ulong freeSpace = 0;
int prevVolumeNameLength = 0;
foreach (ManagementObject volume in
new ManagementObjectSearcher("Select * from Win32_Volume").Get())
{
if (UInt32.Parse(volume["DriveType"].ToString()) > 1 && // Is Volume monuted on host
volume["Name"] != null && // Volume has a root directory
path.StartsWith(volume["Name"].ToString(), StringComparison.OrdinalIgnoreCase) // Required Path is under Volume's root directory
)
{
// If multiple volumes have their root directory matching the required path,// one with most nested (longest) Volume Name is given preference.// Case: CSV volumes monuted under other drive volumes.int currVolumeNameLength = volume["Name"].ToString().Length;
if ((prevVolumeNameLength == 0 || currVolumeNameLength > prevVolumeNameLength) &&
volume["FreeSpace"] != null
)
{
freeSpace = ulong.Parse(volume["FreeSpace"].ToString());
prevVolumeNameLength = volume["Name"].ToString().Length;
}
}
}
if (prevVolumeNameLength > 0)
{
return freeSpace;
}
thrownew Exception("Could not find Volume Information for path " + path);
}
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и / или как этот код отвечает на вопрос, улучшает его долгосрочную ценность.
xiawi
var driveName = "C: \\";
Ним Клауд,
-1
У меня была та же проблема, и я увидел, что лучший ответ дает Варуна Манджула. Однако записывать все это на консоли - не то, что вам нужно. Чтобы получить строку вне информации, используйте следующее
Я хочу отметить, что вы можете просто создать код комментария для всех строк записи консоли, но я подумал, что было бы неплохо, если бы вы его протестировали. Если вы разместите все это друг за другом, вы получите тот же список, что и waruna majuna.
Диск C: \ Тип диска: Фиксированная Метка тома: Файловая система: NTFS Доступное пространство для текущего пользователя: 134880153600 байт Общее доступное пространство: 134880153600 байт Общий размер диска: 499554185216 байт
Привод D: \ Тип привода: CDRom
Диск H: \ Тип диска: Фиксированная Метка тома: Жесткий диск Файловая система: NTFS Доступное пространство для текущего пользователя: 2000010817536 байт Общее доступное пространство: 2000010817536 байт Общий размер диска: 2000263573504 байта
Однако теперь вы можете получить доступ ко всей свободной информации по строкам
Ответы:
это работает для меня ...
using System.IO; private long GetTotalFreeSpace(string driveName) { foreach (DriveInfo drive in DriveInfo.GetDrives()) { if (drive.IsReady && drive.Name == driveName) { return drive.TotalFreeSpace; } } return -1; }
удачи!
источник
drive.TotalFreeSpace
у меня не работает, ноdrive.AvailableFreeSpace
работаетAvailableFreeSpace
как говорит @knocte.AvailableFreeSpace
перечисляет, сколько фактически доступно для пользователя (из-за кавычек).TotalFreeSpace
перечисляет то, что доступно на диске, независимо от того, что пользователь может использовать.Фрагмент рабочего кода с использованием
GetDiskFreeSpaceEx
ссылки от RichardOD.// Pinvoke for API function [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool GetDiskFreeSpaceEx(string lpDirectoryName, out ulong lpFreeBytesAvailable, out ulong lpTotalNumberOfBytes, out ulong lpTotalNumberOfFreeBytes); public static bool DriveFreeBytes(string folderName, out ulong freespace) { freespace = 0; if (string.IsNullOrEmpty(folderName)) { throw new ArgumentNullException("folderName"); } if (!folderName.EndsWith("\\")) { folderName += '\\'; } ulong free = 0, dummy1 = 0, dummy2 = 0; if (GetDiskFreeSpaceEx(folderName, out free, out dummy1, out dummy2)) { freespace = free; return true; } else { return false; } }
источник
... if (!GetDiskFreeSpaceEx(folderName, out free, out total, out dummy)) throw new Win32Exception(Marshal.GetLastWin32Error());
. В любом случае здесь довольно удобно найти код."\\"
. Это может быть любой существующий путь к каталогу или даже простоC:
. Вот моя версия этого кода: stackoverflow.com/a/58005966/964478DriveInfo поможет вам с некоторыми из них (но он не работает с путями UNC), но на самом деле я думаю, вам нужно будет использовать GetDiskFreeSpaceEx . Вероятно, вы сможете добиться некоторой функциональности с помощью WMI. GetDiskFreeSpaceEx выглядит лучшим выбором.
Скорее всего, вам придется очистить свои пути, чтобы заставить его работать правильно.
источник
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(" Drive 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); } } } } /* This code produces output similar to the following: Drive A:\ Drive type: Removable Drive C:\ Drive type: Fixed Volume label: File system: FAT32 Available space to current user: 4770430976 bytes Total available space: 4770430976 bytes Total size of drive: 10731683840 bytes Drive D:\ Drive type: Fixed Volume label: File system: NTFS Available space to current user: 15114977280 bytes Total available space: 15114977280 bytes Total size of drive: 25958948864 bytes Drive E:\ Drive type: CDRom The actual output of this code will vary based on machine and the permissions granted to the user executing it. */
источник
непроверенный:
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: \
источник
Вот отредактированная и упрощенная версия ответа @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; }
источник
Проверьте это (это рабочее решение для меня)
public long AvailableFreeSpace() { long longAvailableFreeSpace = 0; try{ DriveInfo[] arrayOfDrives = DriveInfo.GetDrives(); foreach (var d in arrayOfDrives) { Console.WriteLine("Drive {0}", d.Name); Console.WriteLine(" Drive type: {0}", d.DriveType); if (d.IsReady == true && d.Name == "/data") { Console.WriteLine("Volume label: {0}", d.VolumeLabel); Console.WriteLine("File system: {0}", d.DriveFormat); Console.WriteLine("AvailableFreeSpace for current user:{0, 15} bytes",d.AvailableFreeSpace); Console.WriteLine("TotalFreeSpace {0, 15} bytes",d.TotalFreeSpace); Console.WriteLine("Total size of drive: {0, 15} bytes \n",d.TotalSize); } longAvailableFreeSpaceInMB = d.TotalFreeSpace; } } catch(Exception ex){ ServiceLocator.GetInsightsProvider()?.LogError(ex); } return longAvailableFreeSpace; }
источник
смотрите эту статью !
идентифицировать UNC par или локальный путь к диску, выполнив поиск по индексу ":"
если это UNC PATH, вы cam map UNC path
Код для выполнения имени диска - это имя подключенного диска <UNC Mapped Drive или Local Drive>.
using System.IO; private long GetTotalFreeSpace(string driveName) { foreach (DriveInfo drive in DriveInfo.GetDrives()) { if (drive.IsReady && drive.Name == driveName) { return drive.TotalFreeSpace; } } return -1; }
отключите отображение после того, как ваше требование выполнено.
источник
Я искал размер в ГБ, поэтому я просто улучшил код Супермена, приведенный выше, со следующими изменениями:
public double GetTotalHDDSize(string driveName) { foreach (DriveInfo drive in DriveInfo.GetDrives()) { if (drive.IsReady && drive.Name == driveName) { return drive.TotalSize / (1024 * 1024 * 1024); } } return -1; }
источник
long
но функция возвращаетdouble
.Как предлагает этот ответ и @RichardOD, вы должны сделать следующее:
[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); ulong FreeBytesAvailable; ulong TotalNumberOfBytes; ulong TotalNumberOfFreeBytes; bool success = GetDiskFreeSpaceEx(@"\\mycomputer\myfolder", out FreeBytesAvailable, out TotalNumberOfBytes, out TotalNumberOfFreeBytes); if(!success) throw new System.ComponentModel.Win32Exception(); Console.WriteLine("Free Bytes Available: {0,15:D}", FreeBytesAvailable); Console.WriteLine("Total Number Of Bytes: {0,15:D}", TotalNumberOfBytes); Console.WriteLine("Total Number Of FreeBytes: {0,15:D}", TotalNumberOfFreeBytes);
источник
Мне нужен был аналогичный метод для моего проекта, но в моем случае входные пути были либо с локальных дисковых томов, либо с кластерных томов хранения (CSV). Так что класс DriveInfo у меня не работал. CSV-файлы имеют точку монтирования на другом диске, обычно это C: \ ClusterStorage \ Volume *. Обратите внимание, что C: будет другим томом, чем C: \ ClusterStorage \ Volume1
Вот что я наконец придумал:
public static ulong GetFreeSpaceOfPathInBytes(string path) { if ((new Uri(path)).IsUnc) { throw new NotImplementedException("Cannot find free space for UNC path " + path); } ulong freeSpace = 0; int prevVolumeNameLength = 0; foreach (ManagementObject volume in new ManagementObjectSearcher("Select * from Win32_Volume").Get()) { if (UInt32.Parse(volume["DriveType"].ToString()) > 1 && // Is Volume monuted on host volume["Name"] != null && // Volume has a root directory path.StartsWith(volume["Name"].ToString(), StringComparison.OrdinalIgnoreCase) // Required Path is under Volume's root directory ) { // If multiple volumes have their root directory matching the required path, // one with most nested (longest) Volume Name is given preference. // Case: CSV volumes monuted under other drive volumes. int currVolumeNameLength = volume["Name"].ToString().Length; if ((prevVolumeNameLength == 0 || currVolumeNameLength > prevVolumeNameLength) && volume["FreeSpace"] != null ) { freeSpace = ulong.Parse(volume["FreeSpace"].ToString()); prevVolumeNameLength = volume["Name"].ToString().Length; } } } if (prevVolumeNameLength > 0) { return freeSpace; } throw new Exception("Could not find Volume Information for path " + path); }
источник
Вы можете попробовать это:
var driveName = "C:\\"; var freeSpace = DriveInfo.GetDrives().Where(x => x.Name == driveName && x.IsReady).FirstOrDefault().TotalFreeSpace;
Удачи
источник
У меня была та же проблема, и я увидел, что лучший ответ дает Варуна Манджула. Однако записывать все это на консоли - не то, что вам нужно. Чтобы получить строку вне информации, используйте следующее
Шаг первый: объявить значения в начале
//drive 1 public static string drivename = ""; public static string drivetype = ""; public static string drivevolumelabel = ""; public static string drivefilesystem = ""; public static string driveuseravailablespace = ""; public static string driveavailablespace = ""; public static string drivetotalspace = ""; //drive 2 public static string drivename2 = ""; public static string drivetype2 = ""; public static string drivevolumelabel2 = ""; public static string drivefilesystem2 = ""; public static string driveuseravailablespace2 = ""; public static string driveavailablespace2 = ""; public static string drivetotalspace2 = ""; //drive 3 public static string drivename3 = ""; public static string drivetype3 = ""; public static string drivevolumelabel3 = ""; public static string drivefilesystem3 = ""; public static string driveuseravailablespace3 = ""; public static string driveavailablespace3 = ""; public static string drivetotalspace3 = "";
Шаг 2: фактический код
DriveInfo[] allDrives = DriveInfo.GetDrives(); int drive = 1; foreach (DriveInfo d in allDrives) { if (drive == 1) { drivename = String.Format("Drive {0}", d.Name); drivetype = String.Format("Drive type: {0}", d.DriveType); if (d.IsReady == true) { drivevolumelabel = String.Format("Volume label: {0}", d.VolumeLabel); drivefilesystem = String.Format("File system: {0}", d.DriveFormat); driveuseravailablespace = String.Format("Available space to current user:{0, 15} bytes", d.AvailableFreeSpace); driveavailablespace = String.Format("Total available space:{0, 15} bytes", d.TotalFreeSpace); drivetotalspace = String.Format("Total size of drive:{0, 15} bytes ", d.TotalSize); } drive = 2; } else if (drive == 2) { drivename2 = String.Format("Drive {0}", d.Name); drivetype2 = String.Format("Drive type: {0}", d.DriveType); if (d.IsReady == true) { drivevolumelabel2 = String.Format("Volume label: {0}", d.VolumeLabel); drivefilesystem2 = String.Format("File system: {0}", d.DriveFormat); driveuseravailablespace2 = String.Format("Available space to current user:{0, 15} bytes", d.AvailableFreeSpace); driveavailablespace2 = String.Format("Total available space:{0, 15} bytes", d.TotalFreeSpace); drivetotalspace2 = String.Format("Total size of drive:{0, 15} bytes ", d.TotalSize); } drive = 3; } else if (drive == 3) { drivename3 = String.Format("Drive {0}", d.Name); drivetype3 = String.Format("Drive type: {0}", d.DriveType); if (d.IsReady == true) { drivevolumelabel3 = String.Format("Volume label: {0}", d.VolumeLabel); drivefilesystem3 = String.Format("File system: {0}", d.DriveFormat); driveuseravailablespace3 = String.Format("Available space to current user:{0, 15} bytes", d.AvailableFreeSpace); driveavailablespace3 = String.Format("Total available space:{0, 15} bytes", d.TotalFreeSpace); drivetotalspace3 = String.Format("Total size of drive:{0, 15} bytes ", d.TotalSize); } drive = 4; } if (drive == 4) { drive = 1; } } //part 2: possible debug - displays in output //drive 1 Console.WriteLine(drivename); Console.WriteLine(drivetype); Console.WriteLine(drivevolumelabel); Console.WriteLine(drivefilesystem); Console.WriteLine(driveuseravailablespace); Console.WriteLine(driveavailablespace); Console.WriteLine(drivetotalspace); //drive 2 Console.WriteLine(drivename2); Console.WriteLine(drivetype2); Console.WriteLine(drivevolumelabel2); Console.WriteLine(drivefilesystem2); Console.WriteLine(driveuseravailablespace2); Console.WriteLine(driveavailablespace2); Console.WriteLine(drivetotalspace2); //drive 3 Console.WriteLine(drivename3); Console.WriteLine(drivetype3); Console.WriteLine(drivevolumelabel3); Console.WriteLine(drivefilesystem3); Console.WriteLine(driveuseravailablespace3); Console.WriteLine(driveavailablespace3); Console.WriteLine(drivetotalspace3);
Я хочу отметить, что вы можете просто создать код комментария для всех строк записи консоли, но я подумал, что было бы неплохо, если бы вы его протестировали. Если вы разместите все это друг за другом, вы получите тот же список, что и waruna majuna.
Диск C: \ Тип диска: Фиксированная Метка тома: Файловая система: NTFS Доступное пространство для текущего пользователя: 134880153600 байт Общее доступное пространство: 134880153600 байт Общий размер диска: 499554185216 байт
Привод D: \ Тип привода: CDRom
Диск H: \ Тип диска: Фиксированная Метка тома: Жесткий диск Файловая система: NTFS Доступное пространство для текущего пользователя: 2000010817536 байт Общее доступное пространство: 2000010817536 байт Общий размер диска: 2000263573504 байта
Однако теперь вы можете получить доступ ко всей свободной информации по строкам
источник