Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.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
.NET IO:我可以强制二进制编写器(或文件流)始终刷新到磁盘吗?_.net_Io - Fatal编程技术网

.NET IO:我可以强制二进制编写器(或文件流)始终刷新到磁盘吗?

.NET IO:我可以强制二进制编写器(或文件流)始终刷新到磁盘吗?,.net,io,.net,Io,我需要类似于Java方法的行为,即在数据写入文件后立即将其刷新到磁盘 我倾向于使用我的目的,但它没有一种方法来指定冲洗行为 有什么建议吗?我建议编写一个扩展方法作为包装: public static class MyBinaryWriterExtensions { public static void WriteAndFlush(this BinaryWriter writer, byte[] data) { writer.Write(data); // Slow! Di

我需要类似于Java方法的行为,即在数据写入文件后立即将其刷新到磁盘

我倾向于使用我的目的,但它没有一种方法来指定冲洗行为


有什么建议吗?

我建议编写一个扩展方法作为包装:

public static class MyBinaryWriterExtensions {
  public static void WriteAndFlush(this BinaryWriter writer, byte[] data) {
     writer.Write(data);
     // Slow! Disk access is at least 10 ms! (for a fast disk)
     writer.Flush();
  }
}
这将被称为:

BinaryWriter bw = ... // Getting your writer somehow
byte[] data = ... // your data
bw.WriteAndFlush(data); // Will write and flush!

或者您需要某种原子性吗?

我建议编写一个作为包装器的扩展方法:

public static class MyBinaryWriterExtensions {
  public static void WriteAndFlush(this BinaryWriter writer, byte[] data) {
     writer.Write(data);
     // Slow! Disk access is at least 10 ms! (for a fast disk)
     writer.Flush();
  }
}
这将被称为:

BinaryWriter bw = ... // Getting your writer somehow
byte[] data = ... // your data
bw.WriteAndFlush(data); // Will write and flush!

或者你需要某种原子性吗?

你可以让每一个编写器都进入“使用”状态,并在最后处理它()

using (BinaryWriter writer = new BinaryWriter(File.Open(fileName, FileMode.Create)))
        {
            writer.Write(1.250F);
            writer.Write(@"c:\Temp");
            writer.Write(10);
            writer.Write(true);
        }

对于文本,您可以使用根本不需要刷新的
File.WriteAllText
函数

您可以让每个写入程序都进入“使用”状态,并在最后对其进行处理()

using (BinaryWriter writer = new BinaryWriter(File.Open(fileName, FileMode.Create)))
        {
            writer.Write(1.250F);
            writer.Write(@"c:\Temp");
            writer.Write(10);
            writer.Write(true);
        }

对于文本,您可以使用根本不需要刷新的
文件.writealText
函数
BinaryWriter
不是
密封的
,所有
写入
方法都是
虚拟的
。您可以覆盖它们并添加对
Flush
的调用,例如:

public override void Write(byte value)
{
    base.Write(value);
    Flush(); // which is just: this.OutStream.Flush();
}
然而!在大多数情况下,这对性能非常不利。我不推荐


如果您使用的是
StreamWriter
或类似工具,则只需将
AutoFlush
设置为
true
;完成的工作;但是再一次-这确实会影响性能。

BinaryWriter
不是
密封的
,所有
写入
方法都是
虚拟的
。您可以覆盖它们并添加对
Flush
的调用,例如:

public override void Write(byte value)
{
    base.Write(value);
    Flush(); // which is just: this.OutStream.Flush();
}
然而!在大多数情况下,这对性能非常不利。我不推荐


如果您使用的是
StreamWriter
或类似工具,则只需将
AutoFlush
设置为
true
;完成的工作;但同样-这可能会影响性能。

另请参阅WriteThrough选项,您可以在创建文件流时提供该选项。它会导致流跳过所有操作系统级缓冲。但是,我认为流中仍然存在缓冲,缓冲大小在流的构造函数中指定(如果未指定,则为4k)。因此,我认为通过WriteThrough,流对象本身会缓冲到指定的缓冲区大小已满,然后立即写入底层存储


Ayende在这里有一个write-up:

另请参见WriteThrough选项,您可以在创建文件流时提供该选项。它会导致流跳过所有操作系统级缓冲。但是,我认为流中仍然存在缓冲,缓冲大小在流的构造函数中指定(如果未指定,则为4k)。因此,我认为通过WriteThrough,流对象本身会缓冲到指定的缓冲区大小已满,然后立即写入底层存储


Ayende在这里写了一篇文章:

“它将标记为垃圾收集器”-
使用
与垃圾收集器完全无关
使用
只意味着如果变量非空,它将在块的末尾调用
IDisposable.Dispose()
。@marcGravel,…,这将标记它为准备好进行垃圾回收或实际上不准备进行垃圾回收。它没有显式地将其标记为垃圾收集器就绪。如果保留对
writer
的引用,则仍然不会收集该引用。无论您是否使用
using
,垃圾收集的行为都将100%相同。这两件事在技术层面上是完全不相关的(虽然在人类层面上,它们似乎做了相似的事情,但一件是确定性的,另一件是非确定性的)。不存在将对象标记为“准备收集”这样的事情。这个概念不存在。@MarcGravel,因为您在退出此使用(在我的示例中)writer后无法保留对writer的引用,因此writer将被标记为准备收集。如果您说无法将其标记为收藏或暂时阻止其收藏,您可以阅读本文。我简化了我对Java的回答,他可能不知道如何使用,但也许你是对的,我简化得太多了。垃圾收集器本身会标记对象,这样它就不会收集它们。正如马克所说。。完全无关。“它将标记为垃圾收集器”-
使用
与垃圾收集器完全无关
使用
只意味着如果变量非空,它将在块的末尾调用
IDisposable.Dispose()
。@marcGravel,…,这将标记它为准备好进行垃圾回收或实际上不准备进行垃圾回收。它没有显式地将其标记为垃圾收集器就绪。如果保留对
writer
的引用,则仍然不会收集该引用。无论您是否使用
using
,垃圾收集的行为都将100%相同。这两件事在技术层面上是完全不相关的(虽然在人类层面上,它们似乎做了相似的事情,但一件是确定性的,另一件是非确定性的)。不存在将对象标记为“准备收集”这样的事情。这个概念不存在。@MarcGravel,因为您在退出此使用(在我的示例中)writer后无法保留对writer的引用,因此writer将被标记为准备收集。如果您说无法将其标记为收藏或暂时阻止其收藏,您可以阅读本文。我简化了我对Java的回答,他可能不知道如何使用,但也许你是对的,我简化得太多了。垃圾收集器本身会标记对象,这样它就不会收集它们。正如马克所说。。完全不相关。如果您使用的是
StreamWriter
,一种更简单的方法是将
AutoFlush
设置为
true
@marcGravel。这完全正确,我计划编写BinaryWriter,不过:)编辑..如果您使用的是
StreamWriter
,eas