我们有一个使用.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)
但我宁愿不要,除非真的没有更优雅的方式.
您可以使用自己的工厂方法来构造FileStream.
除此之外,您可以硬连线使用 Reflector (0x1000) 发现的缓冲区大小。
| 归档时间: |
|
| 查看次数: |
6737 次 |
| 最近记录: |