【问题标题】:File.OpenWrite appends instead of wiping contents?File.OpenWrite 追加而不是擦除内容?
【发布时间】:2010-09-06 17:05:06
【问题描述】:

我正在使用以下内容写入文件:

using(Stream FileStream = File.OpenWrite(FileName)) 
   FileStream.Write(Contents, 0, Contents.Length);

我注意到它只是正确地写入文件文件,但没有先擦除文件的内容。然后我决定简单地使用:

File.WriteAllBytes(FileName, Contents);

这很好用。

但是,为什么 File.OpenWrite 不像我使用的其他语言的 OpenWrite 样式功能那样自动删除文件的内容,并且有一个而不是附加?

有什么方法可以做到吗?

【问题讨论】:

标签: c# file


【解决方案1】:

这是File.OpenWrite 的指定行为:

如果文件存在,则在开头打开它进行写入。现有文件不会被截断。

要做你想做的事,就去做:

using(Stream fileStream = File.Open(FileName, FileMode.Create)) 
   fileStream.Write(Contents, 0, Contents.Length);

您当前的调用等效于使用 FileMode.OpenOrCreate,它不会导致现有文件的截断。

FileMode.Create 选项将导致 File 方法在它不存在时创建一个新文件,或者在存在时使用 FileMode.Truncate,为您提供所需的行为。或者,您可以使用File.Create 直接执行此操作。

【讨论】:

  • 我只是认为这与我使用的大多数 IO 库有点不必要的差异,这些库通常将写入作为覆盖,然后有不同的附加方法。感谢您提供有关如何实际打开和清除的信息,非常感谢。
  • @Blam:没问题。在 .NET 中,Open、Create 和 Truncate 都具有独特的含义(这就是为什么我试图回答它并显示 FileModes,因为这确实是唯一清楚地列出它们的地方)。很高兴它有帮助:)
【解决方案2】:

是的,你是对的。 File.OpenWrite 不会覆盖文件。

File.Create 用于覆盖文件(如果存在)。

【讨论】:

  • 这是正确答案。虽然用一个例子来扩展它...... File.Open(<filename>, FileMode.Create, FileAccess.Write) 可选地,您可以使用第四个参数来确定您想要在文件上使用哪种排他锁(如果有的话)。默认情况下,您甚至无法打开文件以在其他程序中读取。例如。 File.Open(<filename>, FileMode.Create, FileAccess.Write, FileShare.ReadWrite)
猜你喜欢
  • 2021-09-18
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 2013-06-10
  • 2019-02-15
  • 2014-08-27
  • 2015-09-13
  • 1970-01-01
相关资源
最近更新 更多