FileStream构造函数和默认缓冲区大小

我们有一个使用.NET 4用C#编写的日志类。我想添加一个构造函数参数,它可以在构造FileStream时选择性地设置FileOptions.WriteThrough标志。 由于这是广泛使用的库代码,我想尽可能少地改变。

现有的FileStream构造函数调用:

_stream = new FileStream(_filePath, FileMode.Append, FileAccess.Write, FileShare.Read); 

问题:

我的构造函数中添加了一个名为writeDirectToDisk的可选bool参数。 我以为我可以做这样的事情:

 var fileOptions = writeDirectToDisk ? FileOptions.WriteThrough : FileOptions.None; _stream = new FileStream(_filePath, FileMode.Append, FileAccess.Write, FileShare.Read, fileOptions); 

但不,没有这样的超载! 除非我遗漏了一些东西,FileStream的构造函数接受FileOptions参数的唯一重载也需要一个缓冲区大小参数!

我尝试过的:

我已经尝试将缓冲区大小设置为零,希望使用默认缓冲区大小,但不会抛出exception。

我搜索过,在框架中找不到一些静态属性或常量,指定默认缓冲区大小。

我的问题:

我不是在这个阶段特别困扰默认缓冲区大小是多少字节。 我只是想知道如何将FileOptions参数添加到构造函数中,尽可能减少代码影响?

我想知道是否有一些常量或静态var我错过了我可以用作缓冲区大小参数,或者如果有一个过载我错过了或者确实如果有一些更聪明的方法来做到这一点。 我还想知道在指定FileOptions.WriteThrough时缓冲区大小是否无关紧要在这种情况下我可以这样做:

  if (writeDirectToDisk) { _stream = new FileStream(_filePath, FileMode.Append, FileAccess.Write, FileShare.Read, 1, FileOptions.WriteThrough); // 1 is the smallest value allowed, it will actually be 8 bytes } else { _stream = new FileStream(_filePath, FileMode.Append, FileAccess.Write, FileShare.Read); } 

但我宁愿不要,除非真的没有更优雅的方式。

您可以使用自己的工厂方法来构造FileStream

除此之外,您可以硬连线使用Reflector(0x1000)发现的缓冲区大小。

这里的默认缓冲区大小可以在.Net的源代码中看到 。

.Net不支持WriteThrough。 你可以使用非托管的Win API调用,你真的想要那个function。 我只花了一天时间试验它,使用它没有任何好处。 10年多以前,这种情况并非如此,缓存对速度有明显的影响。

出于兴趣,有人亲切地编写了整个库来进行API调用,可在此处获得 。