1

我对这个有点新,所以我就开始吧。我试图弄清楚如何检查任何驱动器是否有 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
    }
}
4

4 回答 4

4

如果你return在你的循环中,你将永远不会到达下一个项目。

在 C# 中,使用 Linq,您可以使用如下行获取驱动器集合:

var drivesWithSpace = DriveInfo.GetDrives().Where (di => di.IsReady && di.TotalFreeSpace > 32212254720)

然后,您可以遍历列表:

foreach (DriveInfo drive in drivesWithSpace)
{
    // do something
}
于 2011-11-29T14:42:11.070 回答
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编写的,它可能并不完美。

于 2011-11-29T14:44:10.183 回答
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 最多将迭代一个驱动器。调用多少次都没关系。结果总是相同的(只要没有进行严重的读/写操作)。

也许您想将驱动器名称存储在某处并返回具有可用大小的第一个驱动器?

于 2011-11-29T14:45:28.297 回答
0

您的FreeDriveSpace方法中的循环只运行一次,因为它return要么是要么01它的第一遍。

1如果它发现任何可用空间超过 30 GB 的驱动器,您想要它返回,否则返回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; 
    }

顺便说一句,我建议使用enums 而不是幻数来解决错误。

于 2011-11-29T15:11:01.460 回答