[英]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 個可能的解決方案,它們都旨在解決每個文件級別的問題,而不是操作系統設置級別的問題。
如果您想為策略而更改策略,那么 Windows 策略管理可能會為此提供一個選項。
直寫
現在這里有一大堆緩存在起作用——應用程序/類、操作系統、磁盤電子中的 RAM。 而且我不確定它是否會影響您擔心的特定緩存。 但是 FileStream 有一個名為“WriteThrough”的選項:
指示系統應通過任何中間緩存和 go 直接寫入磁盤。
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);
當然,缺點是您將暫時需要兩倍的磁盤空間,並且在某些修改上會導致大量額外的寫入工作。
好的,所以我找到了解決此問題的方法。
正如 OlivierRogier 也提到的。 此設置似乎存儲在注冊表中:
HKLM\SYSTEM\CurrentControlSet\Enum\ (IDE 或 SCSI) \Diskxxxxxxxxxxxx\DeviceParameters\Disk Key:UserWriteCacheSetting 其中 xxxxxxx 是制造商信息。
鏈接在這里
我設置了一些每天檢查此設置的代碼 => 更改它 => 重新啟動計算機。 如果需要,將共享代碼。
謝謝大家的意見。 布利克森
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.