Проверьте, есть ли больше, чем х байтов на любом диске C#
Я немного новичок в этом, поэтому я просто доберусь до этого. Я пытаюсь выяснить, как проверить, имеет ли ЛЮБОЙ диск 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 ответа
Он не будет проверять несколько дисков, потому что вы возвращаетесь из метода внутри цикла, который проверяет диск.
Необходимо изменить результат метода, чтобы он стал объектом, который может использовать вызывающая сторона, показывающая ответ для каждого диска.
Попробуйте что-то вроде этого...
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, это может быть не идеально.
Если ты return
в вашем цикле вы никогда не доберетесь до следующего пункта.
В C# с Linq вы можете получить коллекцию дисков с такой строкой:
var drivesWithSpace = DriveInfo.GetDrives().Where (di => di.IsReady && di.TotalFreeSpace > 32212254720)
Затем вы можете перебрать список:
foreach (DriveInfo drive in drivesWithSpace)
{
// do something
}
Цикл в вашем FreeDriveSpace
метод выполняется только один раз, потому что return
либо 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 вместо магических чисел за ошибки.
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 будет максимально перебирать один диск независимо от того, есть ли на диске место или нет. Неважно, сколько раз вы это называете. Результат всегда будет одинаковым (до тех пор, пока не будут выполнены серьезные операции чтения / записи).
Может быть, вы хотите где-нибудь сохранить имя диска и вернуть первый диск с доступным размером?