Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# FileStream构造函数和默认缓冲区大小_C#_.net - Fatal编程技术网

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

C# FileStream构造函数和默认缓冲区大小,c#,.net,C#,.net,我们有一个使用.NET4用C#编写的日志类。我想添加一个构造函数参数,它可以在构造一个函数时选择性地设置标志。由于这是广泛使用的库代码,所以我希望尽可能少地进行更改 现有文件流构造函数调用: _stream = new FileStream(_filePath, FileMode.Append, FileAccess.Write, FileShare.Read); 问题: _stream = new FileStream(_filePath, FileMode.Append, FileAcce

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

现有文件流构造函数调用:

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

_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参数的唯一可用重载也需要缓冲区大小参数

我所尝试的:

_stream = new FileStream(_filePath, FileMode.Append, FileAccess.Write, FileShare.Read);
我尝试将缓冲区大小设置为零,希望使用默认缓冲区大小,但没有,它会引发异常

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

我的问题:

_stream = new FileStream(_filePath, FileMode.Append, FileAccess.Write, FileShare.Read);
在这个阶段,我并不特别关心默认缓冲区大小是多少字节。我只是想知道如何在尽可能少的代码影响下将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);
            }

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

您可以使用自己的工厂方法来构建
文件流


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

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

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


出于兴趣,有人编写了整个库来执行API调用,这是可用的。

我不想做任何硬连接,这就是为什么我不关心实际的默认缓冲区大小。如何使用工厂方法构造文件流?如果没有必要的构造函数重载,我仍然会被卡住,不是吗?您仍然可以使用“if(writeDirectToDisk)…”代码在工厂方法内调用适当的构造函数。因此,测试将只在一个地方进行。代码的影响仅限于将“newfilestream(…)”替换为“MyFileStreamFactory.Create(…)”,但不要将缓冲区大小设置为1Joe:代码将仅位于一个位置—它位于我的日志类的构造函数中!:)Magnus,如果我不想将缓冲区大小设置为1,我应该将其设置为什么?如果我发现Reflector的默认值是什么,我将再次回到硬编码,我不希望这样做,因为这将成为一个重大变化。例如,您不应该害怕将缓冲区大小“硬编码”为0x1000。这是一个很好的缓冲区,我看不出有什么问题。