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

本文关键字:缓冲区 默认 构造函数 FileStream | 更新日期: 2023-09-27 18:28:28

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

现有FileStream构造函数调用:

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

问题:

在我们的构造函数中,我添加了一个名为writeDirectToDisk的可选布尔参数。我想我可以做这样的事情:

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

但不,没有这样的超负荷!除非我遗漏了什么,否则接受FileOptions参数的FileStream构造函数唯一可用的重载也需要缓冲区大小参数!

我尝试过的:

我曾尝试将缓冲区大小设置为零,希望使用默认的缓冲区大小,但没有,它会引发异常。

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

我的问题:

在这个阶段,我并不特别关心默认缓冲区大小是多少字节。我只想知道如何在尽可能小的代码影响下将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构造函数和默认缓冲区大小

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

.Net中不支持WriteThrough。如果确实需要非托管Win API调用,则可以使用该功能。我只是花了一天时间试用它,使用它没有任何好处。10多年前,缓存对速度有明显影响,但情况并非如此。

出于兴趣,有人好心地为执行API调用编写了整个库,可在此处获得。

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

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