2017-07-18 51 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驅動器。它在迭代queryCollection1對象時到達DVD驅動器(空磁盤)時引發異常。所以你必須檢查你想要的mo對象的成員是否爲空引用。

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

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

我還將演員陣列更改爲ulong,因爲FreeSpace和Size是ulong類型。並且有一個從ulong到double的隱式轉換。你不需要改變freeSpace和totalSpace的變量類型。

-1

您的劇組指導不妥。而不是演員加倍,你應該投入ulong。 freeSpace和totalSpace的變量應該是相同的類型,並在第一次使用之前初始化。

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

爲什麼downvote?我測試了我的答案,它的工作。使用ip = localhost和本地變量for freeSpace和totalSpace進行了測試。 – Ben