【问题标题】:File.Create is appending to the file rather than overwriting it [closed]File.Create 附加到文件而不是覆盖它[关闭]
【发布时间】:2010-07-19 10:51:00
【问题描述】:

抱歉,还有其他问题。代码现在工作正常。谢谢大家。


如果文件不存在,我有以下代码来创建文件,如果文件已经存在则覆盖它:

FileStream fsExe = File.Create(DestExePath, 4096);
 BinaryWriter bw = new BinaryWriter(fsExe);

无论我写什么到 BinaryWriter,它都会被附加到“DestExePath”而不是覆盖原始文件。

有人知道,为什么会这样?

【问题讨论】:

  • 没有复制,File.Create 绝对没有附加。当然,如果您从不按应有的方式关闭流并不断写入它们,那么它会追加。
  • 如果 NTFS 权限只允许追加会怎样?
  • 正如达林所说,你确定你没有保持流打开吗?
  • @sarnold,如果文件存在,它将被重新创建。
  • 好的,下面的答案表明这是一个错误的诊断。投票结束。

标签: c# .net asp.net file-io


【解决方案1】:

发生这种情况的原因是因为您永远不会关闭底层流并重用相同的二进制写入器来写入当然会附加的文件。我建议您在完成写入文件后关闭流:

using (var stream = File.Create(DestExePath, 4096))
using (var writer = new BinaryWriter(stream))
{
    // Use the writer here to append to the file.
}

【讨论】:

    【解决方案2】:

    如果你保持打开 bw,继续写,它当然会追加。

    如果你想替换文件,你必须关闭文件,再次打开它,然后创建一个新的二进制写入器。

    【讨论】:

    • 这两行,我是第一次打开文件,BinaryWriter是第一次打开,怎么可能已经打开了?
    • 根据文档和我刚刚运行的我自己的测试,应该替换当时文件的内容。你确定你没有保持文件打开并写额外的东西吗?
    【解决方案3】:

    根据文档,这不应该发生:

    "如果指定的文件不存在,则创建;如果存在且不是只读的,则覆盖内容。"

    来源:http://msdn.microsoft.com/en-us/library/d62kzs03.aspx

    【讨论】:

      【解决方案4】:

      您是否遇到此代码的相同行为?

      using (FileStream fileStream = new FileStream(DestExePath, FileMode.Create))
      {
          BinaryWriter bw = new BinaryWriter(fsExe);
      }
      

      【讨论】:

      • 我已经尝试过了,但文件仍然被附加。
      • 应该没有必要先删除文件...运行我自己的测试确认仅使用 File.Create 将删除文件的原始内容。
      【解决方案5】:

      毫无问题地运行这项工作

      Sub Main()
          Dim fsExe = File.Create("c:\test.txt", 4096)
          Dim bw = New BinaryWriter(fsExe)
          bw.Write("this is a test 123")
          fsExe.Close()
      End Sub
      

      确实覆盖

      【讨论】:

        【解决方案6】:

        抱歉,还有其他问题。代码现在工作正常。谢谢大家。

        【讨论】:

        • 很高兴知道“其他问题”是什么! :-)
        • .. 也请接受您自己的回答和描述,这样其他人可能会在六个月后发现这更有用。 :)
        • 或者更好的是,使用问题下方的 [delete] 链接。
        • 其实这个问题和这个问题没有任何关系。我正在创建一个自解压存档文件,我需要在添加到存档之前删除我在 BinaryWriter 中写入的同一文件。
        • 那么一定要删除问题,虽然有6个答案你可能无法做到。
        猜你喜欢
        • 2015-04-29
        • 1970-01-01
        • 2013-02-09
        • 2015-05-25
        • 1970-01-01
        • 1970-01-01
        • 2014-03-07
        • 2018-09-15
        • 1970-01-01
        相关资源
        最近更新 更多