我是c#和.net的初学者。作为unix用户,我的目的是为windows团队提供服务,从windows服务器收集性能数据,并在石墨 (通过StatsD)中对它们进行重新编码。
我找到了一个源代码似乎正是这样做的。,只是它使用了错误的接口(抽象级别错误)。例如,标签被翻译成本地化的windows版本(这是疯狂的),这使得使用此服务变得不可行。
使用wmi性能计数器似乎是可行的,但我希望高效地查询,并发现为此使用刷新对象是推荐的解决方案,但我不知道如何做到这一点。
以某种方式相关的我找到了一次查询值的答案。,我在这里包括作为参考。
问题是:
谢谢
发布于 2013-03-22 17:19:05
下面是我在C#中通过WMI收集有关磁盘使用情况的信息:
private List<DiskInfo> GetDiskInfo()
{
List<DiskInfo> disks = new List<DiskInfo>();
SelectQuery query = new SelectQuery("SELECT Size, FreeSpace, Name, FileSystem FROM Win32_LogicalDisk WHERE DriveType = 3");
ManagementObjectSearcher moSearcher = new ManagementObjectSearcher(scope, query);
ManagementObjectCollection collection = moSearcher.Get();
foreach (ManagementObject res in collection)
{
float size = Convert.ToSingle(res["Size"]) / 1024f;
float usedSpace = size - (Convert.ToSingle(res["FreeSpace"]) / 1024f);
DiskInfo di = new DiskInfo();
di.Name = res["Name"].ToString();
di.Size = ConvertVal(size);
di.UsedSpace = ConvertVal(usedSpace);
if (size > 0)
{
di.PercentUsed = ((usedSpace / size) * 100).ToString("N0");
}
else
{
di.PercentUsed = "0";
}
if (res["FileSystem"] != null)
{
di.FileSystem = res["FileSystem"].ToString();
disks.Add(di);
}
}
return disks;
}
// handles returning the correct units
private string ConvertVal(float value)
{
float K = value;
float M = value / 1024f;
float G = M / 1024f;
float T = G / 1024f;
string unit = "KB";
float val = K;
if (K >= 1024)
{
unit = "MB";
val = M;
}
if (M >= 1024)
{
unit = "GB";
val = G;
}
if (G >= 1024)
{
unit = "TB";
val = T;
}
return val.ToString("N2") + unit;
}
我主要是将上面的代码与一个完整的ComputerInfo类结合使用,我每隔几秒钟就可以在一个将JSON返回给浏览器的JSON服务上从jQuery AJAX调用该类,并使用所提供的数据动态地构造页面。
下面是我的DiskInfo类,用于使数据更易于显示:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ComputerInfo.Models
{
public class DiskInfo
{
public string Name { get; set; }
public string Size { get; set; }
public string UsedSpace { get; set; }
public string PercentUsed { get; set; }
public string FileSystem { get; set; }
}
}
我希望这能帮到你。如果你还需要什么,请告诉我。
https://stackoverflow.com/questions/15581304
复制