2012-01-20 40 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

編輯 - 性能計數器細節

您將需要等待更長的時間超過1000毫秒,看看使用PerformanceCounter中可用磁盤空間的變化。 PerformanceCounter("LogicalDisk", "% Free Space")計數器的刷新率似乎爲300秒。在這五分鐘的時間間隔內重複調用.NextValue()將產生與您所看到的相同的結果。此費率僅基於我所做的一些測試,因此我無法在各種平臺上說明此值的一致性。

如果您需要更短的採樣週期,我可以建議的是您在讀取NextValue後關閉應用程序。在重新打開應用程序時,您會看到最新的PerformanceCounter實例獲取了最新的磁盤空間。我不相信CloseDispose甚至包裝在using,然後創建一個新的實例具有相同的效果。我沒有深入探討這個問題的細節,因爲我可以選擇使用以下選項。

DriveInfo

另外,如果你不綁定到性能計數器並監視本地驅動器,你可以使用方法:DriveInfo類的

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

而且driveInfo.TotalFreeSpace或其他特性。

編輯 - 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在遠程機器上卸載會怎麼樣 –