2017-07-18 15 views
0

現在、ネットワーク上のサーバーの稼働時間とサイズを監視するプログラムを作成しています。私は、サーバのサイズと何のスペースが残っているかを表示する際にいくつかの問題に遭遇しました。ManagementObjectクエリを二重に保存する

私のコードは、私がフリー・スペースとサイズの数字を取ると、二重の変数に入れしようとしている

public void setSpace(string ip) 
{ 
    ManagementScope scope = new ManagementScope("\\\\" + ip + "\\root\\cimv2"); 
    scope.Connect(); 

    ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_OperatingSystem"); 
    SelectQuery query1 = new SelectQuery("Select * from Win32_LogicalDisk"); 

    ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query); 

    ManagementObjectCollection queryCollection = searcher.Get(); 

    ManagementObjectSearcher searcher1 = new ManagementObjectSearcher(scope, query1); 
    ManagementObjectCollection queryCollection1 = searcher1.Get(); 

    foreach (ManagementObject m in queryCollection) 
    { 
     // Display the remote computer information 
     Console.WriteLine("Computer Name : {0}", 
      m["csname"]); 
     Console.WriteLine("Windows Directory : {0}", 
      m["WindowsDirectory"]); 
     Console.WriteLine("Operating System: {0}", 
      m["Caption"]); 
     Console.WriteLine("Version: {0}", m["Version"]); 
     Console.WriteLine("Manufacturer : {0}", m["Manufacturer"]); 
     Console.WriteLine(); 

    } 

    foreach (ManagementObject mo in queryCollection1) 
    { 
     Console.WriteLine(" Disk Name : {0}", mo["Name"]); 
     Console.WriteLine(" Disk Size : {0}", mo["Size"]); 
     Console.WriteLine(" FreeSpace : {0}", mo["FreeSpace"]); 
     Console.WriteLine(" Disk DeviceID : {0}", mo["DeviceID"]); 
     Console.WriteLine(" Disk VolumeName : {0}", mo["VolumeName"]); 
     Console.WriteLine(" Disk SystemName : {0}", mo["SystemName"]); 
     Console.WriteLine("Disk VolumeSerialNumber : {0}", mo["VolumeSerialNumber"]); 
     Console.WriteLine(); 

     freeSpace = freeSpace + (double)mo["FreeSpace"]; 
     totalSpace = totalSpace + (double)mo["Size"]; 

    } 
    Console.ReadLine(); 
} 

です。

freeSpace = freeSpace + (double)mo["FreeSpace"]; 
totalSpace = totalSpace + (double)mo["Size"]; 

私はプログラムを実行しようとすると例外が発生します。

'オブジェクト参照がオブジェクトのインスタンスに設定されていません。'

答えて

1

コードが指定されたメンバー(例:FreeSpace)を返さないため、NullReferenceExceptionが発生しました。 2つのパーティションと1つのDVDドライブがある私のPCでコードを試しました。 queryCollection1オブジェクトの反復処理中にDVDドライブ(空のディスク)に到達したときに例外が発生しました。したがって、必要なmoオブジェクトのメンバーがnull参照かどうかを確認する必要があります。

if (mo["FreeSpace"] != null) 
    freeSpace = freeSpace + (ulong)mo["FreeSpace"]; 

if (mo["Size"] != null) 
    totalSpace = totalSpace + (ulong)mo["Size"]; 

FreeSpaceとSizeがulong型であるため、キャストをulongに変更しました。 ulongからdoubleへの暗黙の変換があります。 freeSpaceとtotalSpaceの変数型を変更する必要はありません。

-1

キャストが間違っています。二重にキャストする代わりに、ulongにキャストする必要があります。変数freeSpaceとtotalSpaceは、同じタイプで、最初に使用する前に初期化する必要があります。

freeSpace = freeSpace + (ulong)mo["FreeSpace"]; 
totalSpace = totalSpace + (ulong)mo["Size"]; 
+0

なぜdownvoteですか?私は私の答えをテストし、それは働いている。テストは、ip = localhostとfreeSpaceとtotalSpaceのローカル変数で行いました。 – Ben

関連する問題