私はディスクに書き込むファイルがたくさんある、私はパフォーマンスを向上させるためにディスクキャッシュを無効にしたい、私はGoogleの検索ソリューションを見つける:Win32 CreateFileメソッドFILE_FLAG_NO_BUFFERINGとHow to empty/flush Windows READ disk cache in C#?があります。どのようにディスクキャッシュを無効にするにはC#を呼び出すWin32ファイルFILE_FLAG_NO_BUFFERINGでCreateFile APIを
私は、テストするコードの少しを書くかどうか働いたことができます。
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操作をサポートするために開かれていなかった、私はこの記事When you create an object with constraints, you have to make sure everybody who uses the object understands those constraintsを見つけましたが、私は完全に理解することはできませんので、私はテストに私のコードを変更します。
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」のバイト数がall.iでないことが必要です。ブロックサイズを1またはその他の整数(512倍ではない)に変更しようとしているときに同じエラーが発生します.i win32 WriteFile apiも同じエラー誰かが私を助けることができますか?バッファなしモードで
あなたはそれがFileOptions.WriteThroughとして利用可能である、のPInvokeする必要はありません。この方法を書くことは、ディスクを待たなければならないので、ずっと遅くなります。 –
デフォルトのオプション(ライトスルーを使用しない)を使用し、60-80kbファイル全体を1回の書き込みで書き込むことをお勧めします。 –