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

Ste*_*edy 6 .net c#

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

现有的FileStream构造函数调用:

_stream = new FileStream(_filePath, FileMode.Append, FileAccess.Write, FileShare.Read);
Run Code Online (Sandbox Code Playgroud)

问题:

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

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

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

我尝试过的:

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

我已经搜索过,并且在框架中找不到一些静态属性或常量,它指定了默认的缓冲区大小.

我的问题:

我现在不是特别困扰默认缓冲区大小是多少字节.我只是想知道如何将尽可能少的代码影响添加到构造函数的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);
            }
Run Code Online (Sandbox Code Playgroud)

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

Joe*_*Joe 3

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

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

  • 但不要将缓冲区大小设置为 1 (2认同)