有没有一种方法可以在 windows 中使用 C# 以编程方式禁用磁盘驱动器上的后写缓存策略?

Is there a way to disable the write behind caching policy on a disk drive programmatically using C# in windows?

我需要删除服务器磁盘驱动器上的后写缓存。在 windows ==> 设备管理器 ==> 磁盘驱动器 ==> (右键单击)属性 ==> 策略 ==> (复选框)启用缓存后写 |很简单,但 windows 会自动重新启用它。我相信更新会发生这种情况。

我想知道我是否可以每天使用 C# 访问这些策略以禁用它们。

有人知道方法吗?

我查看了 DriveInfo,但没有找到访问策略的方法。

我有 2 种可能的解决方案,它们都旨在解决每个文件级别的问题,而不是 OS 设置级别。

如果您想为了政策而更改政策,那么 Windows 政策管理可能有一个选项。

直写

现在这里有一大堆缓存在发挥作用 - Application/Class、OS,磁盘电子设备中的 RAM。而且我不确定它是否会影响您担心的特定缓存。但是 FileStream 有一个名为 "WriteThrough":

的选项

Indicates that the system should write through any intermediate cache and go directly to disk.

https://docs.microsoft.com/en-us/dotnet/api/system.io.fileoptions

Application/Class 缓存很简单,99% 的缓存都被它禁用了。

提到 "System" 向我表明它将进入 OS 缓存(您似乎很担心)。但这只是文档中的一行,所以我不能肯定地说它会下降到 OS 级别。但是,如果有一个选项我会定义用于记录到一个文件并假设在所有现有记录器上启用,就是它。

假设这不是日志记录或类似的流媒体工作,核心问题是部分写入损坏文件的危险,一个小的重新设计可以解决这个问题。

写入临时文件 -> 移动

避免(重新)写入文件时损坏文件的一种可靠方法是写入不同的临时文件 - 然后通过移动将这些文件换出(理想情况下只会更改文件系统名称条目).不久前,我确实为此编写了一些示例代码,因为在字处理器中看到了这种行为:

string sourcepath; //containts the source file path, set by other code
string temppath; //containts the path of the tempfile. Should be in the same folder, and thus same partiion

//Open both Streams, can use a single using for this
//The supression of any Buffering on the output should be optional and will be detrimental to performance
using(var sourceStream = File.OpenRead(sourcepath), 
  outStream = File.Create(temppath, 0, FileOptions.WriteThrough )){

    string line = "";

    //itterte over the input
    while((line = streamReader.ReadLine()) != null){
        //do processing on line here

        outStream.Write(line);
    }
}

//replace the files. Pretty sure it will just overwrite without asking
File.Move(temppath, sourcepath);

缺点当然是你暂时需要两倍的磁盘Space,这会导致一些修改的额外写入工作。

好的,所以我找到了解决这个问题的方法。

正如 OlivierRogier 也提到的那样。此设置似乎存储在以下注册表中:

HKLM\SYSTEM\CurrentControlSet\Enum\(IDE 或 SCSI)\Diskxxxxxxxxxxxx\DeviceParameters\Disk 键:UserWriteCacheSetting 其中 xxxxxxx 是制造商信息。

Link HERE

我设置了一些代码来每天检查此设置 => 更改它 => 重新启动计算机。如果需要,将共享代码。

谢谢大家的意见。 幸福