代码之家  ›  专栏  ›  技术社区  ›  Sheridan

用C编程确定计算机的最大硬盘数据传输速率#

  •  6
  • Sheridan  · 技术社区  · 14 年前

    我用C编写了一个小的WPF小部件,它将当前的CPU活动、使用的RAM和磁盘活动显示为三个小百分比类型条。为此,我使用了以下性能计数器:(diskcounter performanceCounter返回当前磁盘活动总数(字节/秒)

    private void InitialisePerformanceCounters()
    {
        cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total", true);
        totalRam = (int)(new Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory / 1024 / 1024);
        ramCounter = new PerformanceCounter("Memory", "Available MBytes");
        diskCounter = new PerformanceCounter("PhysicalDisk", "Disk Bytes/sec", "_Total", true);
    }
    

    问题是,尽管我已经发现了如何获取总可用RAM来计算已用百分比,但我无法找到如何读取磁盘的“理论”最大数据传输率。我需要这个来计算使用的磁盘传输率的百分比。 任何帮助都将不胜感激。

    3 回复  |  直到 9 年前
        1
  •  2
  •   Adam Robinson    14 年前

    唯一的方法是自己测试。您可以在应用程序开始时这样做:

    byte[] data = new byte[1024];
    
    string path = System.IO.Path.GetTempFileName();
    
    int bytesPerSecond = 0;
    
    using (System.IO.FileStream fs = new System.IO.FileStream(path, System.IO.FileMode.Create))
    {
        System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
    
        watch.Start();
    
        for (int i = 0; i < 1024; i++) fs.Write(data, 0, data.Length);
    
        fs.Flush();
    
        watch.Stop();
    
        bytesPerSecond = (int)((data.Length * 1024) / watch.Elapsed.TotalSeconds);
    }
    
    System.IO.File.Delete(path);
    

    然而,这确实假定 Temp 目录在有问题的磁盘上。否则,您必须在要测量的磁盘上创建一个路径。注意,这是测量写入速度,而不是读取速度。

    这有点做作,因为1MB不需要编写太多的数据,但是您可以使用大量的数据进行尝试;其概念是相同的。

        2
  •  1
  •   codekaizen    14 年前

    尝试使用 WMI API,也 LINQ to WMI 可以帮助。

        3
  •  1
  •   Jonathan    14 年前

    我不知道有什么方法可以获得硬盘的最大数据传输速率,但通过wmi可以获得硬盘的接口(usb,ide…)。您可以使用接口的最大数据传输速率,并将百分比重新提供给它。

    另外,我将在这里留下一个链接,指向一篇关于使用wmi获取hd信息的小文章,以及源代码。 LINK