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

时间:2012-03-20 16:39:53

标签: c# .net

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

现有的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参数的构造函数的唯一重载也需要一个缓冲区大小参数!

我尝试了什么:

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

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

我的问题:

我现在没有特别困扰默认缓冲区大小的字节数。我只是想知道如何在尽可能少的代码影响下将FileOptions参数添加到构造函数中?

我想知道是否有一些常量或静态变量,我错过了我可以用作缓冲区大小参数,或者如果有一个重载我错过了,或者确实如果有一些更聪明的方法来做到这一点。我还想知道在指定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);
            }

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

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

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

出于兴趣,有人亲切地编写了整个库来进行API调用,可用here