IT’s Ha

[.NET] CPU,Memory, HDD 정보 가져오기 본문

.NET

[.NET] CPU,Memory, HDD 정보 가져오기

Deleloper Ha 2023. 3. 7. 16:50
728x90
반응형

안녕하세요.

이번 포스팅은 Windows OS환경에서 CPU와 Memory, HDD 정보 가져오기 입니다.(하나의 예시를 구현하였고, 세부적인 내용은 필요하신 기능에 의해 수정하여 사용하시면 됩니다.)

개발 환경은 C# Console Project를 이용하였고, .NET 7.0을 사용하였습니다. 

1. 프로젝트 생성

먼저,  C# Console Project를 생성해주세요. 프로젝트명은 MonitoringExample으로 지정해줍니다. 

2. MemoryClass 생성

프로젝트 아래에 Class 디렉토리(폴더)를 생성합니다. 그리고 그 안에 클래스를 추가합니다. 

namespace MonitoringExample.Class
{
    public class MemoryClass
    {
        // 메모리 총 용량
        private double _totalSize = 0;
        // 여유 공간
        private double _freeSize = 0;
        // 사용 공간
        private double _useSize = 0;
        public double TotalSize
        {
            get { return _totalSize; }
            set { _totalSize = value; }
        }
        public double FreeSize
        {
            get { return _freeSize; }
            set
            {
                _freeSize = value;
            }
        }
        public double UseSize
        {
            get { return _useSize; }
            set { _useSize = value; }
        }
    }
}

메모리에서 가져올 내용은 메모리의 총 용량, 여유 공간, 사용 공간 입니다.

3. HardDiskClass

Class 폴더 아래에 클래스를 추가합니다.

namespace MonitoringExample.Class
{
    public class HardDiskClass
    {
        //하드디스크 이름
        private string _name = string.Empty;
        // Total 용량
        private long _totalSize = 0;
        // 여유 공간
        private long _freeSize = 0;
        // 사용 공간
        private long _useSize = 0;

        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
        public long TotalSize
        {
            get { return _totalSize; }
            set { _totalSize = value; }
        }

        public long FreeSize
        {
            get { return _freeSize; }
            set
            {
                _freeSize = value;
            }
        }
        public long UseSize
        {
            get { return _useSize; }
            set { _useSize = value; }
        }
    }
}

하드디스크에서 가져올 정보는 하드 디스크의 이름, 총 용량, 여유 공간, 사용 공간 입니다.

4. PCClass

using System.Collections.ObjectModel;

namespace MonitoringExample.Class
{
    public class PCClass
    {
        // CPU 사용량
        private double _cpuUsage;

        // Memory 사용량
        private MemoryClass _memory = new MemoryClass();

        // HDD (2개 이상 될수 있기 때문에 ObservableCollection에 정보를 저장)
        private ObservableCollection<HardDiskClass> _hardDisk = new ObservableCollection<HardDiskClass>();
        public double CpuUsage
        {
            get { return _cpuUsage; }
            set { _cpuUsage = value; }
        }
        public MemoryClass Memory
        {
            get { return _memory; }
            set { _memory = value; }
        }
        public ObservableCollection<HardDiskClass> HardDisk
        {
            get { return _hardDisk; }
            set { _hardDisk = value; }
        }

    }
}

PCClass는 CPU사용량, 메모리 클래스, 디스크정보들을 가지고 있습니다. 디스크 같은경우는 2개 이상 나눠져있을 가능성이 있어 ObservableCollection클래스로 구성하였습니다.

5. ServiceClass

using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Management;

namespace MonitoringExample.Class
{
    //서비스 클레스

    public class ServiceClass
    {
        public static PCClass PC = new PCClass();
        private Thread thread;
        PerformanceCounter cpu = new PerformanceCounter("Processor Information", "% Processor Utility", "0,_Total");
        public ServiceClass() 
        {
            thread = new Thread(ScanStatus);
            thread.IsBackground = true;

            thread.Start();
        }
        private async void ScanStatus()
        {
            try
            {
                do
                {
                    await Task.Delay(500);
                    ScanHddDisk();
                    ScanMemory();
                    ScanCPU();
                } while (true);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
        private void ScanHddDisk()
        {
            DriveInfo[] hddDrives = DriveInfo.GetDrives();
            ObservableCollection<HardDiskClass> tmpHdd = new ObservableCollection<HardDiskClass>();
            HardDiskClass hdd;
            foreach (DriveInfo drive in hddDrives)
            {
                if (drive.DriveType == DriveType.Fixed)
                {

                    hdd = new HardDiskClass();
                    hdd.Name = drive.Name.ToString();
                    hdd.TotalSize = drive.TotalSize / 1024 / 1024 / 1024;
                    hdd.FreeSize = drive.AvailableFreeSpace / 1024 / 1024 / 1024;
                    hdd.UseSize = (drive.TotalSize - drive.AvailableFreeSpace) / 1024 / 1024 / 1024;

                    tmpHdd.Add(hdd);
                }
            }
            PC.HardDisk = tmpHdd;
        }

        private void ScanMemory()
        {
            var wmi = new ManagementObjectSearcher("select * from Win32_OperatingSystem");
            var info = wmi.Get().Cast<ManagementObject>().Select(mo => new MemoryClass()
            {
                TotalSize = Math.Round(double.Parse(mo["TotalVisibleMemorySize"].ToString()) / 1024 / 1024, 2),
                FreeSize = Math.Round(double.Parse(mo["FreePhysicalMemory"].ToString()) / 1024 / 1024, 2),
                UseSize = Math.Round((double.Parse(mo["TotalVisibleMemorySize"].ToString()) - double.Parse(mo["FreePhysicalMemory"].ToString())) / 1024 / 1024, 2)
            }).FirstOrDefault();

            PC.Memory = info;
        }

        private void ScanCPU()
        {
            var sValue = Math.Round(cpu.NextValue(),2);
            PC.CpuUsage = sValue;
        }

    }
}

서비스 클레스는 CPU,Memory, Disk정보를 가지고 오는 역할을 합니다. 

1) PerformanceCounter

PerformanceCounter는 Windows에서 제공하는 성능 모니터의 정보를 가지고 있습니다. 여기서 저희는 CPU의 정보를 가져 오기위해 사용을 합니다. 성능모니터를 실행하시면 아래와 같은 화면이 나타납니다.

Windows 성능 모니터

위 성능 모니터에서 + 버튼을 누르면 카운터 추가 화면이 나타납니다. 

카운터 추가

우리가 CPU에서 가지고 올 카운터는 Processor Information 에서 % Processor Utility의 인스턴스에 0,_Total에 대한 정보를 가지고 올려고 합니다. 다른 사이트에서는 Processor카운터의 정보를 가지고 오는 경우가 있는데, 작업관리자와 같은 내용을 보여주기 위해서는, Processor Information의 정보를 가지고 사용합니다.

2)ManagementObjectSearcher

- ManagementObjectSearcher를 이용하여 OS에 대한 정보를 가지고 옵니다. 메모리의 정보를 가지고 올 예정입니다.

3)ScanHddDisk

- DriveInfo[] hddDrives = DriveInfo.GetDrives(); 디바이스의 정보를 가지고 와서 DriveType.Fixed을 디스크 정보로 저장하게 됩니다.

4)ScanMemory

- ManagementObjectSearcher를 이용하여 OS에 대한 정보를 가지고 옵니다. 그리고 총 용량(TotalVisibleMemorySize), 여유 공간(FreePhysicalMemory), 사용량은 (총 용량 - 여유 공간)의 데이터를 사용합니다. 

5)ScanCPU

- CPU의 정보는 PerformanceCounter를 통하여 가져옵니다. 그리고 소숫점 2자리까지 표현을 위하여 Math함수를 사용하여 반올림 처리합니다. 

이번 포스팅은 여기서 마치겠습니다.

6.Program.cs

using MonitoringExample.Class;

namespace MonitoringExample
{
    static class Program
    {
        static void Main(string[] args)
        {
            ServiceClass ms = new ServiceClass();
            

            while (true)
            {
                Thread.Sleep(2000);
                Console.WriteLine("==============================================================");
                Console.WriteLine("Memory TotSize : " + ServiceClass.PC.Memory.TotalSize + "Gb");
                Console.WriteLine("Memory FreeSize : " + ServiceClass.PC.Memory.FreeSize + "Gb");
                Console.WriteLine("Memory UseSize : " + ServiceClass.PC.Memory.UseSize + "Gb");

                Console.WriteLine("CPU : " + ServiceClass.PC.CpuUsage + "%");

                foreach (HardDiskClass hdd in ServiceClass.PC.HardDisk)
                {
                    Console.WriteLine("HDD Disk " + hdd.Name + " - Total SIze : " + hdd.TotalSize + "Gb , Use Size : " + hdd.UseSize + "Gb , Free Size : " + hdd.FreeSize + "Gb");
                }
            }
        }
    }
}

프로그램 파일에서는 ServiceClass를 생성하고 데이터를 콘솔에 뿌려줍니다.

7. 실행결과

실행결과

위와같이 결과가 나옵니다.

궁금하신 내용이나 잘못된 내용은 댓글이나 메일로 부탁드리겠습니다. 감사합니다.

 

728x90
반응형

'.NET' 카테고리의 다른 글

[.NET] Visual Studio Nuget 패키지 오류  (0) 2023.02.15
Comments