我对这方面有点陌生,所以我就开始吧。我想知道如何检查任何驱动器是否有30 GB的磁盘空间,到目前为止,我似乎无法让它做的不仅仅是检查C:驱动器。
这可能与CopyAvailableCheck((只检查它从C:驱动器获得的第一个值有关,但我不知道如何解决这个问题。
任何帮助都将不胜感激。这是我的代码:
public class DriveCheck
{
private void CopyAvailableCheck()
{
if (FreeDriveSpace() == 1)
{
// do something
}
else if (FreeDriveSpace() == 0)
{
// Something Else
}
else if (FreeDriveSpace() == -1)
{
// Something else
}
}
public static int FreeDriveSpace()
{
DriveInfo[] allDrives = DriveInfo.GetDrives();
foreach (DriveInfo d in allDrives)
{
if (d.IsReady == true)
{
// If total free space is more than 30 GB (default)
if (d.TotalFreeSpace >= 32212254720) // default: 32212254720
{
return 1; // If everything is OK it returns 1
}
else
{
return 0; // Not enough space returns 0
}
}
}
return -1; // Other error returns -1
}
}
如果您在循环中return
,您将永远无法访问下一项。
在C#中,使用Linq,您可以获得带有以下行的驱动器集合:
var drivesWithSpace = DriveInfo.GetDrives().Where (di => di.IsReady && di.TotalFreeSpace > 32212254720)
然后,您可以迭代列表:
foreach (DriveInfo drive in drivesWithSpace)
{
// do something
}
它不会检查多个驱动器,因为您是从检查磁盘的循环内的方法返回的。
您需要将方法的结果更改为可以由显示每个驱动器答案的调用者使用的对象。
试试这样的。。。
private void CopyAvailableCheck()
{
var listOfDisks = FreeDriveSpace();
foreach( var disk in listOfDisks )
{
if ( disk.Status == 1)
{
// do something
}
else if ( disk.Status = 0 )
{
//do something else
}
}
}
public static List<Disk> FreeDriveSpace()
{
DriveInfo[] allDrives = DriveInfo.GetDrives();
var listOfDisks = new List<Disk>();
foreach (DriveInfo d in allDrives)
{
var currentDisk = new Disk( d.Name );
if (d.IsReady == true)
{
// If total free space is more than 30 GB (default)
if (d.TotalFreeSpace >= 32212254720) // default: 32212254720
{
currentDisk.Status = 1;
}
else
{
currentDisk.Status = 0; // Not enough space
}
}
listOfDisks.Add( currentDisk );
}
return listOfDisks;
}
public class Disk
{
public Disk( string name )
{
Name = name;
}
public string Name
{
get; set;
}
public int Status
{
get; set;
}
}
希望这能有所帮助。
这不是在VS中写的,它可能并不完美。
foreach (DriveInfo d in allDrives)
{
if (d.IsReady == true)
{
// If total free space is more than 30 GB (default)
if (d.TotalFreeSpace >= 32212254720) // default: 32212254720
{
return 1; // If everything is OK it returns 1
}
else
{
return 0; // Not enough space returns 0
}
}
}
因此,无论驱动器是否有空间,这个foreach最多会在一个驱动器上迭代。不管你调用了多少次,结果总是一样的(只要没有进行过认真的读/写操作(。
也许您想将驱动器名称存储在某个位置,然后返回第一个可用大小的驱动器?
FreeDriveSpace
方法中的循环只运行一次,因为它在第一次传递中是return
的0
或1
。
如果它发现任何可用空间超过30 GB的驱动器,您希望它返回1
,否则返回0
:
public static int FreeDriveSpace()
{
DriveInfo[] allDrives = DriveInfo.GetDrives();
foreach (DriveInfo d in allDrives)
{
if (d.IsReady == true && d.TotalFreeSpace >= 32212254720)
{
return 1; // the control only reaches this return statement if a drive with more than 30GB free space is found
}
}
// if the control reaches here, it means the if test failed for all drives. so return 0.
return 0;
}
顺便说一句,我建议使用enum
s而不是幻数来处理错误。