2

Int64または任意の大きな数に変換するときに、次のコードで問題が発生します。どんな助けでも大歓迎です。

public static void GetDiskspace(string MachineName, string DriveLetter) 
{ 
  ConnectionOptions options = new ConnectionOptions(); 
  ManagementScope scope = new ManagementScope("\\\\" + MachineName + "\\root\\cimv2",  
  options); 
  scope.Connect(); 
  SelectQuery query1 = new SelectQuery("Select * from Win32_LogicalDisk"); 

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

  foreach (ManagementObject mo in queryCollection1) 
  { 
      // Display Logical Disks information 

      if (mo["Name"].Equals(DriveLetter.ToUpper()+":"))
          if (((Int64)mo["FreeSpace"]) < (1024 * 1024 * 100)) //100GB  <<----HERE IS WHERE I GET THE ERROR
          {
              Console.WriteLine(MachineName + " ALERT. LOW SPACE ON DRIVE " + mo["Name"]);
              Console.WriteLine();
              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();
          }
  } 
  string line; 
  line = Console.ReadLine();  
} 

編集:「サイズ」を「FreeSpace」に変更しました。

4

2 に答える 2

4

ulongボックス化されてobjectいます。したがって、ボックスを解除できるのはulong(つまりUInt64)のみです。

 if (((UInt64)mo["Size"]) < (1024 * 1024 * 100))

ここに画像の説明を入力してください

Win32_LogicalDiskクラスを見てください

class Win32_LogicalDisk : CIM_LogicalDisk
{
    ...
    uint64   Size;
    ...
};

Win32_LogicalDiskクラスプロパティの説明からの抜粋:

サイズ

Data type: uint64 
Access type: Read-only Size of the disk drive.
This property is inherited from CIM_LogicalDisk.

PS:

1)実際に必要な場合Int64は、次のキャストを行うことができます。

(Int64)(UInt64)mo["Size"]

2)Eric Lippertによるこの記事を読んで、問題の例外の本質を明らかにすることができます。

于 2012-09-28T02:25:45.060 に答える
2

TryParse代わりに、値が有効な数値であるかどうかを確認するために使用します。

long number;
bool result = Int64.TryParse(mo["Size"], out number);
于 2012-09-28T02:25:34.297 に答える