获得可用磁盘空间
鉴于下面的每个input,我想在该位置获得自由空间。 就像是
long GetFreeSpace(string path)
input:
c: c:\ c:\temp \\server \\server\C\storage
DriveInfo会帮助你一些(但它不适用于UNCpath),但真的,我认为你将需要使用GetDiskFreeSpaceEx 。 您可能可以通过WMI实现一些function。 GetDiskFreeSpaceEx看起来像你最好的select。
有可能你将不得不清理你的path才能正常工作。
这对我有用…
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; }
祝你好运!
从RichardOD链接使用GetDiskFreeSpaceEx
工作代码片段。
// 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; } }
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. */
看到这篇文章 !
-
通过search“:”的索引来识别UNC参数或本地驱动器path
-
如果它是UNC PATH,则凸轮映射UNCpath
-
执行驱动器名称的代码是映射的驱动器名称<UNC映射的驱动器或本地驱动器>。
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; }
-
完成要求后取消映射。
未经testing:
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:\
我正在寻找GB的大小,所以我刚刚改进了超人的代码,并做了以下修改:
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; }
我想为我的项目提供一个类似的方法,但在我的情况下,inputpath是来自本地磁盘卷或群集存储卷(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); }
我有同样的问题,我看到了最好的答案。 但是,把它写在控制台上并不是你想要的。 要获取string,请使用以下信息
第一步:开始声明值
//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);
我想说明的是,你可以使所有的控制台writelines评论代码,但我认为这将是很好的你来testing它。 如果你把所有这些都显示出来,你会得到和waruna majuna一样的列表
驱动器C:\驱动器types:固定卷标签:文件系统:NTFS当前用户可用空间:134880153600字节总可用空间:134880153600字节驱动器总大小:499554185216字节
驱动器D:\驱动器types:CDRom
驱动器H:\驱动器types:固定卷标:HDD文件系统:NTFS当前用户可用空间:2000010817536字节总可用空间:2000010817536字节驱动器总大小:2000263573504字节
但是现在您可以访问string中的所有松散信息
检查出来(这是我的工作解决scheme)
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; }
作为这个答案和@RichardODbuild议,你应该这样做:
[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);