TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.75K subscribers
Post #2970 2.42K
День 2469. #ЗаметкиНаПолях
Сброс Кэша на Диск в Windows
При работе с файловыми системами Windows понимание принципов работы дискового кэша важно для обеспечения целостности данных и оптимизации производительности. Дисковое кэширование повышает производительность системы за счёт временного хранения операций записи в памяти перед их сохранением на диск. Однако это также означает, что в случае отключения питания или сбоя системы данные могут быть потеряны, если они не были сброшены из кэша в постоянное хранилище.

Если дисковое кэширование включено, Windows сохраняет запросы записи в энергозависимой памяти (RAM) вместо немедленной записи на диск. Это обеспечивает повышение производительности, но влечет за собой риски:
- Преимущества: более высокая производительность приложений, снижение нагрузки на дисковый ввод-вывод.
- Риски: возможная потеря данных при сбоях питания или системных сбоях.

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

Для приложений .NET, простейший способ сделать это - вызвать метод FileStream.Flush(true):
using System.Text.Encoding;

using var fs =
new FileStream(@"C:\data.txt", FileMode.Create);
var data = UTF8.GetBytes("Важные данные");
fs.Write(data);

// Сброс в операционную систему
fs.Flush();

// Сброс на диск (обходит буферы ОС)
fs.Flush(flushToDisk: true);

Параметр flushToDisk: true гарантирует, что данные будут записаны в обход любых промежуточных буферов непосредственно на устройство хранения.

Предотвращение кэширования при небуферизованном вводе-выводе
Если нужно полностью избежать кэширования, можно использовать флаг FileOptions.WriteThrough при создании файла:
await using var fs = 
new FileStream(path,
FileMode.Create,
FileAccess.Write,
FileShare.None,
4096,
FileOptions.WriteThrough);

Обратите внимание, что этот вариант может работать медленнее, чем использование буферизованного ввода-вывода с Flush(flushToDisk: true). В большинстве случаев вы можете произвести запись в файл несколько раз без сброса, а затем выполнить один сброс, чтобы гарантировать запись всех данных на диск.

Источник: https://www.meziantou.net/flushing-disk-caches-on-windows-a-comprehensive-guide.htm
  • 👍 14
More from @netdeveloperdiary
  1. Sep 30, 2026Post #3356
  2. Sep 29, 2026Фото 3 (с) Анатолий Кулаков
  3. Sep 29, 2026День 2799. Конференция DotNext 2026. Часть 1 25 и 26 сентября в Москве прошла очередная ко…
  4. Sep 28, 2026День 2798. #Оффтоп Утиная Типизация в C# с Помощью Перехватчиков. Часть 2 Некоторое время…
  5. Sep 27, 2026День 2797. #ЗаметкиНаПолях #AI Рабочий процесс с Copilot для .NET. Окончание Начало Продол…
  6. Sep 26, 2026День 2796. #ЗаметкиНаПолях #AI Рабочий процесс с Copilot для .NET. Продолжение Начало Три…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →