2010-09-06 102 views
39

我用下面写一个文件:File.OpenWrite附加而不是擦除内容?

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

我注意到,它就是被写入文件正确的文件,但没有第一抹文件的内容。然后我决定简单地使用:

File.WriteAllBytes(FileName, Contents); 

这工作正常。

但是,为什么File.OpenWrite自动删除文件的内容,因为我用它们的OpenWrite样式函数做的其他语言,并且有一个而不是追加?

有没有方法做到这一点?

+0

您可以随时使用http://msdn.microsoft.com/en-us/library/5h0z48dh.aspx – Andrey 2010-09-06 17:10:54

回答

65

这是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直接执行此操作。

+0

我只是认为这与我通常使用的大多数IO库有点不必要的差异作为覆盖,然后有一个不同的方法来追加。感谢有关如何实际打开和清除的信息,非常感谢。 – Blam 2010-09-06 17:13:49

+0

@Blam:没问题。在.NET中,Open,Create和Truncate都有独特的含义(这就是为什么我试图回答它显示FileModes的原因,因为这真是唯一清楚列出它们的地方)。很高兴帮助:) – 2010-09-06 17:26:46

15

是的你是对的。 File.OpenWrite不会覆盖该文件。如果存在,File.Create用于覆盖文件。

+0

这是正确的答案。虽然扩展它的例子... 'File.Open(,FileMode.Create,FileAccess.Write)' 或者,您可以使用第四个参数来确定什么样的排他锁,如果有的话,你想要在文件上。默认情况下,您甚至无法打开文件以读取其他程序。例如。 'File.Open(,FileMode.Create,FileAccess.Write,FileShare.ReadWrite)' – TomWardrop 2017-05-22 06:34:19

相关问题