示例#1
0
        /// <summary>
        /// Returns volumes based on a given name or index.
        /// </summary>
        /// <param name="nameOrIndex">Name or index of the volume to return.</param>
        /// <returns>Either all volumes or a volume based on the given option</returns>
        public List <Volume> GetVolumesForOption(string nameOrIndex = "all")
        {
            List <Volume> result = new List <Volume>();

            if (nameOrIndex == Constants.AllVolumes)
            {
                result = Volumes;
            }
            else
            {
                Volume volume = null;
                if (int.TryParse(nameOrIndex, out int index) == true)
                {
                    volume = Volumes.Find(v => v.Index == index);
                    if (volume != null)
                    {
                        result.Add(volume);
                    }
                }
                else
                {
                    volume = Volumes.Find(v => v.Name == nameOrIndex);
                    if (volume != null)
                    {
                        result.Add(volume);
                    }
                }
            }

            return(result);
        }
            private async Task PollVolumePerformanceUtilizationAsync()
            {
                const string query = @"
                    SELECT Name,
                           Timestamp_Sys100NS,
                           DiskReadBytesPersec,
                           DiskWriteBytesPersec
                      FROM Win32_PerfRawData_PerfDisk_LogicalDisk";

                var queryTime    = DateTime.UtcNow.ToEpochTime();
                var combinedUtil = new Volume.VolumePerformanceUtilization
                {
                    DateEpoch   = queryTime,
                    ReadAvgBps  = 0,
                    WriteAvgBps = 0
                };

                using (var q = Wmi.Query(Endpoint, query))
                {
                    foreach (var data in await q.GetDynamicResultAsync().ConfigureAwait(false))
                    {
                        var perfData = new PerfRawData(this, data);

                        var name  = perfData.Identifier;
                        var iface = Volumes.Find(i => name == GetCounterName(i.Name));
                        if (iface == null)
                        {
                            continue;
                        }

                        iface.ReadBps  = (float)perfData.GetCalculatedValue("DiskReadBytesPersec", 10000000);
                        iface.WriteBps = (float)perfData.GetCalculatedValue("DiskWriteBytesPersec", 10000000);

                        var util = new Volume.VolumePerformanceUtilization
                        {
                            DateEpoch   = queryTime,
                            ReadAvgBps  = iface.ReadBps,
                            WriteAvgBps = iface.WriteBps
                        };

                        var netData = VolumePerformanceHistory.GetOrAdd(iface.Name, k => new List <Volume.VolumePerformanceUtilization>(1024));
                        UpdateHistoryStorage(netData, util);

                        //if (PrimaryInterfaces.Contains(iface))
                        {
                            combinedUtil.ReadAvgBps  += util.ReadAvgBps;
                            combinedUtil.WriteAvgBps += util.WriteAvgBps;
                        }
                    }
                }

                UpdateHistoryStorage(CombinedVolumePerformanceHistory, combinedUtil);
            }
 internal List <Volume.VolumePerformanceUtilization> GetVolumePerformanceUtilizationHistory(Volume iface)
 {
     if (iface != null &&
         Volumes.Find(x => x == iface) != null &&
         VolumePerformanceHistory.ContainsKey(iface.Name))
     {
         return(VolumePerformanceHistory[iface.Name]);
     }
     else
     {
         return(new List <Volume.VolumePerformanceUtilization>(0));
     }
 }
            private async Task GetAllVolumesAsync()
            {
                const string query = @"
SELECT Caption,
       DeviceID,
       Description,
       FreeSpace,
       Name,
       Size,
       VolumeSerialNumber
  FROM Win32_LogicalDisk
 WHERE DriveType = 3"; //fixed disks

                using (var q = Wmi.Query(Endpoint, query))
                {
                    foreach (var disk in await q.GetDynamicResultAsync().ConfigureAwait(false))
                    {
                        var id = $"{disk.DeviceID}";
                        var v  = Volumes.Find(x => x.Id == id) ?? new Volume();

                        v.Id          = $"{disk.DeviceID}";
                        v.Available   = disk.FreeSpace;
                        v.Caption     = disk.VolumeSerialNumber;
                        v.Description = disk.Name + " - " + disk.Description;
                        v.Name        = disk.Name;
                        v.NodeId      = Id;
                        v.Size        = disk.Size;
                        v.Type        = "Fixed Disk";
                        v.Status      = NodeStatus.Active;
                        v.Used        = v.Size - v.Available;
                        if (v.Size > 0)
                        {
                            v.PercentUsed = 100 * v.Used / v.Size;
                        }
                        if (v.Node == null)
                        {
                            v.Node = this;
                            Volumes.Add(v);
                        }
                    }
                }
            }