【问题标题】:StreamWriter - Not appending to created fileStreamWriter - 不附加到创建的文件
【发布时间】:2010-11-12 08:26:55
【问题描述】:

我正在使用 StreamWriter 对象写入由构造函数创建或已经存在的文件。如果文件存在,那么它会附加数据。如果没有,那么它应该创建一个文件,然后还附加数据。问题是,当需要创建文件时,StreamWriter 构造函数创建文件但没有向文件写入任何数据。

bool fileExists = File.Exists(filePath);

using (StreamWriter writer = new StreamWriter(filePath, true))
{
    if (!fileExists)
    {
        writer.WriteLine("start");
    }

    writer.WriteLine("data");
}

编辑: 感谢您的回答。 using 块负责关闭编写器。至于其他人说它对他们有用,我可以给你任何信息来进一步诊断问题吗?该文件通过网络本地化。这可能是一个潜在的问题。我间歇性地收到错误消息,“找不到路径的一部分......”和“指定的网络名称不再可用。”

【问题讨论】:

  • 您的代码在我的机器上运行良好。
  • 对我也有用...@Dan,再试一次并检查一下,也许你在第一次运行时错过了什么? using 语句应该负责关闭和刷新...
  • 您上面的代码 sn-p 对我来说是一种享受,您确定其他东西没有干扰文件吗?
  • 我再次检查了我的代码,仍然没有发现任何异常。所有这一切的奇怪之处在于,如果文件存在,它将起作用。我将收到一个内容为“数据数据数据”的文件。但它从不在初始调用中附加任何内容。
  • 这段代码是否有可能包装在 try...catch 块中,而在 catch 语句中没有错误处理?

标签: c# file-io streamwriter


【解决方案1】:

代码在我的电脑上运行良好。我们能知道变量 filePath 包含什么吗?也许您查看的文件有误...

更新:网络问题?也许有人在网络的另一端做某事。尝试写入本地文件。如果可行,请尝试写入另一个位置的远程文件。

【讨论】:

  • 字符串文件路径 = @"\\server\folder\filename.htm";在创建文件后,它适用于后续调用,所以我知道它是正确的路径。
  • 根据您给出的间歇性错误消息,服务器本身可能处于忙碌/离线状态。或者文件夹本身已被删除,而您没有创建文件夹的权限(或尚未创建文件夹)。可能是文件/文件夹权限问题?
【解决方案2】:

好的,所以我想通了。我的本地计算机在通过网络间歇性访问文件时遇到问题。我将代码上传到服务器并在那里运行,没有任何问题。我真的很感谢所有的帮助。很抱歉,解决方案不是很令人兴奋。

【讨论】:

    【解决方案3】:

    可以试试File.Open 函数。 FileModes 的底部和列表中有一个很好的示例 FileMode.Append 是你想要的

    【讨论】:

      【解决方案4】:

      你的代码对我来说是正确的..

      试试 using 语句

      using (StreamWriter writer = new StreamWriter(filePath, true))
      {
          if (!fileExists)
          {
              writer.WriteLine("start");
          }
      
          writer.WriteLine("data");
          writer.Flush();
      }
      

      【讨论】:

      • 作者使用using声明?
      • 如果你看示例代码,我使用的是 using 语句?
      【解决方案5】:

      与其他发布过的人一样,您的代码在我的 PC 上运行良好。

      将代码分成两部分可能会对您有所帮助,如果文件尚不存在,则第一部分编写标头,然后第二部分编写数据:

      try
      {
          using (FileStream fs = new FileStream(filePath, FileMode.CreateNew))
          {
              using (StreamWriter sw = new StreamWriter(fs))
              {
                  sw.WriteLine("start");
              }
          }
      }
      catch (IOException ex)
      {
      }
      
      using (StreamWriter writer = new StreamWriter(filePath, true))
      {
          writer.WriteLine("data");
      }
      

      【讨论】:

        【解决方案6】:

        您的代码对我有用,经过 3 次运行后我已经:

        开始 数据 数据 数据

        您确定您没有尝试访问文件,由于某种原因您无法写入它吗?另外,为了确保在处理它之前放置writer.Close(),尽管Dispose() 应该刷新数据。如果这没有帮助,请尝试使用带有适当标志的 File.Create() 手动创建文件。

        //编辑: 我在我的机器上试过这个代码:

        公共不安全静态无效 Main() { 字符串文件路径 = @"\\COMP-NAME\Documents\foo.txt"; 文件流 fs = null; if (!File.Exists(filePath)) fs = File.Create(filePath); 别的 fs = File.Open(filePath, FileMode.Append); 使用 (StreamWriter writer = new StreamWriter(fs)) { writer.WriteLine("数据"); } }

        而且运行流畅,可以试试这个吗?

        【讨论】:

        • 这是我的第一反应。如果文件不存在并且只使用上面的代码,我尝试创建文件,但这也会在第一次调用时写入。以这种方式在服务器上创建文件是否存在延迟问题?
        • 我已经在编辑部分发布了我编写的代码,以检查这是否可以通过网络工作。顺便说一句,不要将其视为生产代码,因为这次使用不是 100% 正确使用,但它对我有用,它在创建文件时放入数据,然后附加到 id。
        猜你喜欢
        • 1970-01-01
        • 2015-08-12
        • 2011-01-30
        • 2011-11-10
        • 2017-01-21
        • 2015-02-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多