Есть ли способ отключить политику кэширования записи на диск программным образом с помощью C # в Windows? - PullRequest
0 голосов
/ 08 ноября 2019

Мне нужно удалить запись за кэшированием на дисках наших серверов. В Windows ==> Диспетчер устройств ==> Дисководы ==> (щелкните правой кнопкой мыши) Свойства ==> Политики ==> (CheckBox) Включить запись за кэшированием |Это просто, но Windows автоматически включает его. Я считаю, что это происходит с обновлениями.

Я хочу знать, могу ли я получить доступ к этим политикам с помощью C #, чтобы отключать их ежедневно.

Кто-нибудь знает способ?

Я посмотрел на DriveInfo, но не нашел методов доступа к политикам.

Ответы [ 2 ]

2 голосов
/ 08 ноября 2019

У меня есть 2 возможных решения, оба из которых направлены на решение проблемы на уровне файлов, а не на уровне настроек ОС.

Если вы хотите изменить политику для политик, то управление политиками WindowsУ меня может быть опция для этого.

WriteThrough

Теперь в игре присутствует целый ряд кэшей - Приложение / Класс, ОС, ОЗУ в Disk Eletronics,И я не уверен, может ли это повлиять на определенный кеш (ы), о котором вы беспокоитесь. Но FileStream имеет опцию «WriteThrough»:

Указывает, что система должна выполнить запись через любой промежуточный кэш и перейти непосредственно на диск.

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

Кэш приложения / класса тривиален и до 99% отключается этим.

Упоминание о «Системе» указывает мне, что оно попадет в кэш ОС (что вас беспокоит). Но это только одна строка в документации, поэтому я не могу с уверенностью сказать, что она опускается до уровня ОС. Но если есть одна опция, которую я бы определил для входа в файл и предположить, что она будет включена для всех существующих регистраторов, вот она.

Предполагается, что не для ведения журнала или подобной потоковой передачи. работа и основная проблема - это опасность повреждения файла частичной записью, небольшая редизайн может решить эту проблему.

Запись в Tempfile -> Перемещение

Один верный путьчтобы избежать повреждения файла при (пере) его записи, нужно записать в другой временный файл, а затем просто поменять их местами с ходом (который в идеале изменит только записи имени файловой системы). Я написал некоторый пример кода для этого не так давно после того, как увидел это поведение в текстовых процессорах:

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

Недостатком является то, что вам потребуется временно вдвое больше дискового пространства, и это вызоветмного дополнительной работы по написанию некоторых модификаций.

0 голосов
/ 13 ноября 2019

Ладно, вот и нашел решение этой проблемы.

Как уже упоминал ОливьеРогье. Кажется, этот параметр хранится в реестре по адресу:

HKLM \ SYSTEM \ CurrentControlSet \ Enum \ (IDE ИЛИ SCSI) \ Diskxxxxxxxxxxxx \ DeviceParameters \ Ключ диска: UserWriteCacheSetting, где xxxxxxx - информация о производителе.

Ссылка ЗДЕСЬ

Я установил некоторый код, который ежедневно проверяет этот параметр => изменяет его => перезагружает компьютер. Поделюсь кодом, если требуется.

Спасибо всем за ваш вклад. Blixem

...