检查任何驱动器c#上是否有超过x个字节

时间:2011-11-29 14:33:40

标签: c# foreach driveinfo

我对此有点新意,所以我会接受它。 我试图弄清楚如何检查任何驱动器是否有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 个答案:

答案 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在第一次传递中01

如果找到任何超过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代替幻数来代替错误。