2

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

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

有人知道方法吗?

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

4

2 回答 2

2

我得到了 2 个可能的解决方案,它们都旨在解决每个文件级别的问题,而不是操作系统设置级别的问题。

如果您想为策略而更改策略,那么 Windows 策略管理可能会为此提供一个选项。

直写

现在这里有一大堆缓存在起作用——应用程序/类、操作系统、磁盘电子中的 RAM。而且我不确定它是否会影响您担心的特定缓存。但是 FileStream 有一个名为“WriteThrough”的选项:

指示系统应该通过任何中间缓存写入并直接进入磁盘。

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

应用程序/类缓存是微不足道的,并且 99% 被此禁用。

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

假设这不适用于日志记录或类似的流式传输工作,并且核心问题是部分写入损坏文件的危险,那么小的重新设计可以解决该问题。

写入临时文件 -> 移动

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

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);

当然,缺点是您将暂时需要两倍的磁盘空间,并且在某些修改上会导致大量额外的写入工作。

于 2019-11-08T07:53:06.680 回答
1

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

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

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

链接在这里

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

谢谢大家的意见。布利克森

于 2019-11-13T10:26:20.907 回答