首页 > 解决方案 > 在 C# 中获取特定进程的磁盘使用情况

问题描述

如何在 C# 中获取特定进程的磁盘使用率 (MB/s)?

我能够像这样获得 CPU 使用率和 RAM 使用率:

var cpu = new PerformanceCounter("Process", "% Processor Time", ProcessName, true)
var ram = new PerformanceCounter("Process", "Working Set - Private", ProcessName, true);

Console.WriteLine($"CPU = {cpu.NextValue() / Environment.ProcessorCount} %");
Console.WriteLine($"RAM = {ram.NextValue() / 1024 / 1024} MB");

但我找不到与磁盘使用相关的任何内容。

如任务管理器中所示:

等

标签: c#.net

解决方案


♻️ 方法

如此处所述^2

此 API 将告诉您 I/O 操作的总数以及总字节数。

您可以调用 GetProcessIoCounters 来获取每个进程的整体磁盘 I/O 数据 -您需要自己跟踪增量并转换为基于时间的速率。

所以,根据这个 C# 教程,你可以按照这些思路做一些事情:

struct IO_COUNTERS
{
    public ulong ReadOperationCount;
    public ulong WriteOperationCount;
    public ulong OtherOperationCount;
    public ulong ReadTransferCount;
    public ulong WriteTransferCount;
    public ulong OtherTransferCount;
}

[DllImport("kernel32.dll")]
private static extern bool GetProcessIoCounters(IntPtr ProcessHandle, out IO_COUNTERS IoCounters);

public static void Main()
{
    IO_COUNTERS counters;
    Process[] processes = Process.GetProcesses();

    foreach(Process process In processes)
    {
        try {
            GetProcessIoCounters(process.Handle, out counters);
            console.WriteLine("\"" + process.ProcessName + " \"" + " process has read " + counters.ReadTransferCount.ToString("N0") + "bytes of data.");
        } catch (System.ComponentModel.Win32Exception ex) {
        }
    }
    console.ReadKey();
}

使用来将其转换为 VB.NET

但是(System.ComponentModel.Win32Exception ex)发生

System.ComponentModel.Win32Exception (0x80004005): Access is denied
   at System.Diagnostics.ProcessManager.OpenProcess(Int32 processId, Int32 access, Boolean throwIfExited)
   at System.Diagnostics.Process.GetProcessHandle(Int32 access, Boolean throwIfExited)
   at System.Diagnostics.Process.OpenProcessHandle(Int32 access)
   at System.Diagnostics.Process.get_Handle()
   at taskviewerdisktest.Form1.Main() in C:\...\source\repos\taskviewerdisktest\taskviewerdisktest\Form1.vb:line 32

有些流程似乎真的很难访问.. 好消息是,在我的情况下,它们中的数量并不多(250 个中的 15 个或其他)..

⚠️免责声明:这更像是一种“解决方案”而不是“解决方案”

♻️ 其他方法和参考


推荐阅读