каждый, у меня много файлов, записываемых на диск в секунду, я хочу отключить дисковый кеш для повышения производительности, я ищу поиск в Google: win32 метод CreateFile с FILE_FLAG_NO_BUFFERING и Как очистить / очистить Windows READ кеш диска в C #? .
Я пишу небольшой код для проверки работоспособности:
const int FILE_FLAG_NO_BUFFERING = unchecked((int)0x20000000);
[DllImport("KERNEL32", SetLastError = true, CharSet = CharSet.Auto, BestFitMapping = false)]
static extern SafeFileHandle CreateFile(
String fileName,
int desiredAccess,
System.IO.FileShare shareMode,
IntPtr securityAttrs,
System.IO.FileMode creationDisposition,
int flagsAndAttributes,
IntPtr templateFile);
static void Main(string[] args)
{
var handler = CreateFile(@"d:\temp.bin", (int)FileAccess.Write, FileShare.None,IntPtr.Zero, FileMode.Create, FILE_FLAG_NO_BUFFERING, IntPtr.Zero);
var stream = new FileStream(handler, FileAccess.Write, BlockSize);//BlockSize=4096
byte[] array = Encoding.UTF8.GetBytes("hello,world");
stream.Write(array, 0, array.Length);
stream.Close();
}
при запуске этой программы приложение получает исключение: Операция ввода-вывода не будет работать. Скорее всего, файл станет слишком длинным или дескриптор не был открыт для поддержки синхронных операций ввода-вывода
позже я нашел эту статью Когда вы создаете объект с ограничениями, вы должны убедиться, что все, кто использует объект, понимают эти ограничения , но я не могу полностью понять, поэтому я изменяю свой код проверить:
var stream = new FileStream(handler, FileAccess.Write, 4096);
byte[] ioBuffer = new byte[4096];
byte[] array = Encoding.UTF8.GetBytes("hello,world");
Array.Copy(array, ioBuffer, array.Length);
stream.Write(ioBuffer, 0, ioBuffer.Length);
stream.Close();
он работает нормально, но я просто хочу, чтобы байты "привет, мир" не все. Я пытаюсь изменить размер блока на 1 или другое целое число (не кратное 512), получаю ту же ошибку. можете мне помочь?