みんな、私は毎秒ディスクにたくさんのファイルを書き込みます、私はパフォーマンスを改善するためにディスクキャッシュを無効にしたいです、私は解決策を見つけます:FILE_FLAG_NO_BUFFERINGでwin32CreateFileメソッドとC#でWindowsREADディスクキャッシュを空/フラッシュする方法?。
うまくいくかどうかをテストするためのコードを少し書きます。
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();
}
このプログラムを実行すると、アプリケーションで例外が発生します。IO操作は機能しません。ファイルが長くなるか、同期IO操作をサポートするためにハンドルが開かれなかった可能性があります
後で、この記事を見つけました。制約付きのオブジェクトを作成するときは、オブジェクトを使用するすべての人がそれらの制約を理解していることを確認する必要がありますが、完全には理解できないため、コードを変更してテストします。
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();
正常に実行されていますが、すべてではなく「hello、world」バイトが必要です。ブロックサイズを1または他の整数(512倍ではない)に変更しようとすると同じエラーが発生します。win32WriteFileapiも同じエラーが発生します。誰かが私を助けることができます?