代码之家  ›  专栏  ›  技术社区  ›  Rob Packwood

streamwriter未将最后几个字符写入文件

  •  8
  • Rob Packwood  · 技术社区  · 15 年前

    我们在一台服务器上遇到了问题,它使用了streamwriter类。是否有人经历过与以下问题类似的事情?如果是这样,解决问题的方法是什么?

      using( StreamWriter logWriter = File.CreateText( logFileName ) )
      {
        for (int i = 0; i < 500; i++)
          logWriter.WriteLine( "Process completed successfully." );
      } 
    

    当写出文件时,将生成以下输出:

      Process completed successfully.
      ...  (497 more lines)
      Process completed successfully.
      Process completed s
    

    在关闭之前尝试添加logwriter.flush(),但没有任何帮助。我写出的文本行越多,数据丢失的次数就越多。

    7 回复  |  直到 8 年前
        1
  •  1
  •   Henk Holterman    15 年前

    无法复制。

    在正常情况下,这不应该也不会失败。

    • 这是失败的实际代码吗?文本“进程完成”表明它是一个摘录。
    • 是否涉及线程?
    • 网络驱动器还是本地驱动器?
    • 等。
        2
  •  16
  •   zero    13 年前

    我自己也有一个非常相似的问题。我发现,如果在对流进行任何写入操作之前启用了自动刷新,它就会按预期工作。 logWriter.AutoFlush = true;

        3
  •  3
  •   Bonshington    15 年前

    有时候,即使你调用flush(),它也不会起作用。becusflush()将导致流在流中写入除缓冲区最后一个块之外的大部分数据。

    try
    {
     // ... write method
     // i dont recommend use 'using' for unmanaged resource
    }
    finally
    {
     stream.Flush();
     stream.Close();
     stream.Dispose();
    }
    
        4
  •  1
  •   Dr. Wily's Apprentice    15 年前

    这对我来说显然是一个“刷新”问题,即使你说你添加了一个对flush()的调用。问题可能是您的streamwriter只是底层filestream对象的包装器。

    我通常不使用file.createText方法创建用于写入文件的流;我通常创建自己的文件流,然后根据需要用streamwriter包装它。不管怎样,我遇到了需要调用streamwriter和filestream上的flush的情况,所以我认为这是您的问题。

    尝试添加以下代码:

                logWriter.Flush();
                if (logWriter.BaseStream != null)
                    logWriter.BaseStream.Flush();
    
        5
  •  0
  •   Kevin Gosse    13 年前

    我也面临同样的问题

    跟随者为我工作

    using (StreamWriter tw = new StreamWriter(@"D:\Users\asbalach\Desktop\NaturalOrder\NatOrd.txt"))
    {
        tw.Write(abc.ToString());// + Environment.NewLine);
    }
    
        6
  •  0
  •   Brendan Green    11 年前

    这对我有好处:

    streamWriter.flush();
    
        7
  •  0
  •   user3800527    8 年前

    在框架4.6.1的使用中,在很大的压力下,仍然存在这个问题。我不知道为什么它会这样做,尽管我找到了一种方法来解决它,非常不同(这加强了我的感觉,它确实是一个.NET错误)。

    在我的例子中,我尝试将巨大的锯齿状阵列写入磁盘(视频缓存)。 由于锯齿状的数组非常大,它必须进行大量的重复写入来存储一组大型的视频帧,并且尽管它们是未压缩的,并且每个缓存文件都有精确的1000帧,但是记录的现金文件的大小都不一样。

    我用这个的时候有问题

    //note, generateLogfileName is just a function to create a filename()
    
    using (FileStream fs = new FileStream(generateLogfileName(), FileMode.OpenOrCreate))
    {
      using (StreamWriter sw = new StreamWriter(fs)
      {
        // do your stuff, but it will be unreliable
      }
    }
    

    但是,当我向它提供一种编码类型时,所有记录的文件的大小都相等,问题就消失了。

    using (FileStream fs = new FileStream(generateLogfileName(), FileMode.OpenOrCreate))
      {
        using (StreamWriter sw = new StreamWriter(fs,Encoding.Unicode))
        {
          // all data written correctly,  no data lost.
        }
     }
    

    请注意,读取文件宽度的编码类型也相同!