2012-01-20 33 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在远程机器上卸载会怎么样 –