我对此有点新意,所以我会接受它。 我试图弄清楚如何检查任何驱动器是否有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
}
}
答案 0 :(得分:4)
如果您在循环中return
,则永远不会进入下一个项目。
在C#中,使用Linq,您可以使用如下所示的行获取驱动器集合:
var drivesWithSpace = DriveInfo.GetDrives().Where (di => di.IsReady && di.TotalFreeSpace > 32212254720)
然后您可以遍历列表:
foreach (DriveInfo drive in drivesWithSpace)
{
// do something
}
答案 1 :(得分:0)
它不会检查多个驱动器,因为您从检查磁盘的循环内的方法返回。
您需要将方法的结果更改为可以由调用者使用的对象,该调用者显示每个驱动器的答案。
尝试这样的事情......
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写的,可能不完美。
答案 2 :(得分:0)
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最多会迭代一个驱动器。你打电话多少次并不重要。结果将始终相同(只要没有进行严格的读/写操作)。
也许您想将驱动器名称存储在某处并返回可用大小的第一个驱动器?
答案 3 :(得分:0)
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
代替幻数来代替错误。