2012-01-20 12 views
2
File.Delete("D:\\filler.tmp"); // now %free space is 41 
var freeSpaceCounter=new PerformanceCounter("LogicalDisk", "% Free Space", "D:"); 
freeSpaceCounter.NextSample(); 
Console.WriteLine(freeSpaceCounter.NextValue()); // returns 41 
freeSpaceCounter.Dispose(); 
freeSpaceCounter.Close(); 
Thread.Sleep(1000); 
Process p = Process.Start("fsutil", "file createnew d:\\filler.tmp 16000000000"); 
p.WaitForExit(); // now % free space is 1 
Thread.Sleep(1000); 
freeSpaceCounter = new PerformanceCounter("LogicalDisk", "% Free Space", "D:"); 
freeSpaceCounter.NextSample(); 
Console.WriteLine(freeSpaceCounter.NextValue()); // returns 41 
Console.WriteLine(freeSpaceCounter.NextValue()); // returns 41 
Thread.Sleep(1000); 
freeSpaceCounter.NextSample(); 
Console.WriteLine(freeSpaceCounter.NextValue()); // returns 41 
Console.WriteLine(freeSpaceCounter.NextValue()); // returns 41 

実際の値が1になると、41を返すのはなぜですか?現在の値を何度得ることができますか?パフォーマンスカウンタNextValueは以前の同じ値を返します

答えて

4

EDIT - パフォーマンスカウンタの詳細

あなたはPerformanceCounterを使用してディスクの空き領域の変化を見るために1000ミリ秒よりも長く待つ必要があります。 PerformanceCounter("LogicalDisk", "% Free Space")カウンタのリフレッシュレートは300秒です。 .NextValue()をこの5分間隔で繰り返し呼び出すと、あなたが見ているのと同じ結果になります。このレートは私がやったいくつかのテストにのみ基づいているので、私は様々なプラットフォーム間でこの価値の一貫性について話すことはできません。

サンプリング時間を短くする必要がある場合は、NextValueの読み取り後にアプリケーションを終了することをお勧めします。アプリケーションを再起動すると、新しいPerformanceCounterインスタンスによって最新のディスク容量が取得されていることがわかります。私はCloseDispose、またはusingにラップするとは信じられませんし、新しいインスタンスを作成するのと同じ効果がありました。私は次のオプションを使う選択肢があったので、この問題の詳細をあまりにも詳しく調べなかった。あなたは、パフォーマンスカウンタにバインドされていないと、ローカルドライブを監視している場合

DriveInfo

はまた、あなたが使用することができます。DriveInfoクラスの

System.IO.DriveInfo driveInfo = new DriveInfo("D:"); 

そしてdriveInfo.TotalFreeSpaceまたは他の特性。

EDIT - WMI

あなたはまた、リモートマシンをチェックする必要がある場合は、WMIを使用することができます。たぶん次のことがあなたのために働くでしょう。

System.Management.ManagementScope scope = 
    new System.Management.ManagementScope(@"\\remoteMachine\root\cimv2"); 

ObjectQuery query = 
    new ObjectQuery("SELECT Name, Freespace FROM Win32_LogicalDisk WHERE DriveType=3"); 

ManagementObjectSearcher search = new ManagementObjectSearcher(scope, query); 
ManagementObjectCollection results = search.Get(); 

foreach (ManagementObject mo in results) 
{ 
    Console.WriteLine("Drive: {0} -- Free Space: {1}", mo["Name"], mo["FreeSpace"]); 
} 
+0

私が掲載したコードは、ローカルマシンとリモートマシンで同様の動作をします。私はDriveInfoクラスを使用することはできませんので、リモートマシン上の空きディスク容量を照会する必要があります。 –

+0

しかし、PerformanceCountersを使用する必要がありますか?代わりにWMIはどうですか? –

+0

リモートマシンでWMIがアンインストールされた場合 –

関連する問題