1

ここに私が持っているものがあります:

public static bool DriveHasLessThanTenPercentFreeSpace(string server)
{
    long driveSize = 0;
    long freeSpace = 0;

    var oConn = new ConnectionOptions {Username = "username", Password = Settings.Default.SQLServerAdminPassword};
    var scope = new ManagementScope("\\\\" + server + "\\root\\CIMV2", oConn);
    scope.Connect();

    var query = new ObjectQuery("SELECT FreeSpace FROM Win32_LogicalDisk where DeviceID = 'D:'");

    var searcher = new ManagementObjectSearcher(scope, query);
    ManagementObjectCollection queryCollection = searcher.Get();
    foreach (ManagementObject m in queryCollection)
    {
        //the FreeSpace value is in bytes
        freeSpace = Convert.ToInt64(m["FreeSpace"]);

        //error happens here!
        driveSize = Convert.ToInt64(m["Size"]);
    }

    long percentFree = ((freeSpace / driveSize) * 100);
    if (percentFree < 10)
    {
        return true;
    }
    return false;
}

このコード行は私にエラーを与えています:

driveSize = Convert.ToInt64(m["Size"]);

エラーは言う:

ManagementException was unhandled by user code

見つかりません

ドライブのサイズを取得するためのクエリが間違っていると思います。

次の行で freeSpace 値を取得していることに注意してください。

freeSpace = Convert.ToInt64(m["FreeSpace"]);

したがって、クエリが freeSpace で機能していることはわかっています。

誰か手を貸してくれませんか?

4

1 に答える 1

2

クエリに含める必要がありSELECT * FROM Win32_LogicalDisk...ます。

クエリで「FreeSpace」を選択しているため、空き領域以外は何も返されず、他のすべては例外をスローします。

すべてを返したくない場合(リモートクエリのため)、いくつかのオプションがあります。

  • 管理者が2つのアイテムのみを選択できるかどうかわかりませんか?私は構文に精通していません。しかし、あなたは試すことができますSELECT FreeSpace, Size FROM Win32_LogicalDisk...
  • そうでない場合は、2つのクエリを実行できます。1つは空き領域用、もう1つはサイズ用です。
于 2012-11-15T17:03:07.567 に答える