Проверьте, есть ли больше, чем х байт на любом диске c # - PullRequest
1 голос
/ 29 ноября 2011

Я немного новичок в этом, поэтому я просто доберусь до этого. Я пытаюсь выяснить, как проверить, имеет ли ЛЮБОЙ диск 30 ГБ дискового пространства, Пока что я не могу заставить его делать больше, чем просто проверять диск 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 голосов
/ 29 ноября 2011

Если вы return в своем цикле, вы никогда не перейдете к следующему элементу.

В C # с Linq вы можете получить коллекцию дисков с такой строкой:

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

Затем вы можете выполнить итерацию по списку:

foreach (DriveInfo drive in drivesWithSpace)
{
    // do something
}
0 голосов
/ 29 ноября 2011

Цикл в вашем методе FreeDriveSpace выполняется только один раз, потому что он return s либо 0, либо 1 за первый проход.

Вам нужно, чтобы он возвратил 1, если найдет какой-либо диск с более чем 30 ГБ свободного места, в противном случае верните 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 вместо магических чисел для ошибок.

0 голосов
/ 29 ноября 2011
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 будет максимально перебирать один диск независимо от того, есть ли на диске место или нет.Неважно, сколько раз вы это называете.Результат будет всегда одинаковым (до тех пор, пока не будут выполнены серьезные операции чтения / записи).

Может быть, вы хотите где-нибудь сохранить имя диска и вернуть первый диск с доступным размером?

0 голосов
/ 29 ноября 2011

Он не будет проверять несколько дисков, потому что вы возвращаетесь из метода внутри цикла, который проверяет диск.

Вам нужно изменить результат метода, чтобы он стал объектом, который может быть использованвызывающий, который показывает ответ для каждого диска.

Попробуйте что-то вроде этого ...

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, этоможет быть не идеальным.

...