1

私はこれにちょっと慣れていないので、それについて説明します。ドライブに30GBのディスク容量があるかどうかを確認する方法を見つけようとしています。これまでのところ、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

メソッドのループは、最初のパスで または であるため、FreeDriveSpace1 回だけ実行されます。return01

必要なのは、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; 
    }

ところで、enumエラーにはマジック ナンバーの代わりに s を使用することをお勧めします。

于 2011-11-29T15:11:01.460 に答える
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 は、ドライブにスペースがあるかどうかに関係なく、せいぜい 1 つのドライブを反復処理します。何度呼んでも構いません。結果は常に同じです (重大な読み取り/書き込み操作が行われていない限り)。

ドライブ名をどこかに保存して、使用可能なサイズの最初のドライブを返したいと思うかもしれません。

于 2011-11-29T14:45:28.297 に答える
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 に答える