保持外部磁盘旋转

时间:2014-02-16 12:24:44

标签: c# hard-drive

我的笔记本问题非常烦人。我有一个带有系统的内部SSD驱动器和一个外部旧硬盘驱动器(在光盘托架中),主要用于大型游戏。问题是,每10秒不活动后,硬盘驱动器会继续旋转。无论如何都会发生这种情况 - 尝试了一切(包括Windows电源管理),没有运气 - 磁盘每次都完全忽略所有设置。当在spindown之后尝试访问新数据时,这会造成无法忍受的滞后,这使大多数游戏无法播放。这些不断的旋转/缩小也会缩短磁盘寿命。

因此,在尝试了一些方法之后,我决定编写一个C#应用程序,它将简单地计算下面列表中随机文件中的行 - 位于外部驱动器上,逐行读取文件。它是一个winforms应用程序,但方法keepSpinning在一个单独的线程中调用。

    List<string> filesToSpin = new List<string>();
    public Form1()
    {
        filesToSpin.Add(@"D:\book\Generic_User_Guide.pdf");
        filesToSpin.Add(@"D:\book\Quick Guide.pdf");
        filesToSpin.Add(@"D:\book\pck_ls.pdf");
        filesToSpin.Add(@"D:\book\guide_amd64.pdf");
    }

    private void keepSpinning()
    {
        while(someKeepAliveVariable)
        {
            Random r = new Random();
            int index = r.Next(filesToSpin.Count);
            string spinThis = filesToSpin[index];
            int counter = 0;
            string line;
            Console.WriteLine("Reading file: " + spinThis);
            System.IO.StreamReader file =
                new System.IO.StreamReader(spinThis);
            while ((line = file.ReadLine()) != null)
            {
                counter++;
            }
            file.Close();
            Console.WriteLine("Read {0} lines.", counter.ToString());
            Thread.Sleep(2000);
        }
    }

好。令人惊讶的是,这也行不通。它工作了一段时间,但它继续打印读取文件的信息,但磁盘停止。我想驱动器会以某种方式缓存这些文件。行计数方法也非常占用CPU。 有关代码更改的任何建议都会有所帮助,也期待任何其他解决方案。

3 个答案:

答案 0 :(得分:2)

写入磁盘上的文件而不是读取。请记住每隔一段时间清除这些文件。

另外,另一方面,硬盘听起来不太好。

答案 1 :(得分:2)

首先,谢谢大家的所有回复。我尝试了一些不同的方法,最后,经过一年的努力找到了解决方案。很抱歉没有提供硬盘名称。这是:WD750BPVT。我也没有提到第二个问题:驱动器在空闲时点击,在磁盘spindown之前几次。 我会回答我自己的问题,以便将头发留在某人头上。问题不容易追踪。

编写C#应用程序是一种非常好的方法,但它有其缺点。当我将代码更改为写入数据而不是读取时,它非常成功(没有spindowns)但驱动器在空闲时(每2-3秒)不断点击。

有人会说,由于点击声音,硬盘已经准备好死了,我应该备份我的数据,同时准备丢弃设备。但是我找到了解释。所有这些东西的原因是一个功能,旨在节省一些电源和磁盘寿命(原文如此!)。这个功能,或者实际上有两个是:

Automatic Acoustic Management (AAM)
Advanced Power Management (APM)

电源管理调节旋转和声学管理负责头部停车(点击噪音)。 您所要做的就是禁用这两个。 例如,您可以在CrystalDiskInfo中执行此操作:functions - &gt;高级 - &gt; AAM / APM控件,选择所需的驱动器,然后单击两个禁用按钮。直到重启才解决问题。它不是永久性的,因此将CrystalDiskInfo添加到启动是一个很好的举措。

此解决方案也可能适用于其他设备/制造商,因此如果您遇到类似问题,我强烈建议尝试一下。

答案 2 :(得分:0)

它可能会失败,因为操作系统会读取文件的大缓冲区并将其放入缓存中。

你可以:

  • 写入文件而不是读取,每次刷新文件。
  • 使用FILE_FLAG_NO_BUFFERING(然后您需要使用win32 API CreateFile)。