2010-10-07 76 views
7

我们遇到了一个服务器的问题,它是StreamWriter类的使用。有没有人遇到过类似于下面的问题?如果是这样,解决这个问题的解决方案是什么?StreamWriter没有写出文件的最后几个字符

​​

当写出生成以下输出文件:

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

尝试过接近没有任何帮助增加logWriter.Flush()。我写出的文字越多,发生的数据丢失就越多。

+0

与你的问题没有关系,但是对Close的调用是多余的...... StreamWriter将被放置在使用块的末尾 – 2010-10-07 18:45:30

+0

是的,更新了帖子并删除了该行。谢谢! – 2010-10-07 18:46:44

+1

没有人会写这样的日志记录方法。它会覆盖以前记录的行。代码*真的*看起来像什么? – 2010-10-07 18:56:10

回答

1

无法重现此操作。

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

  • 这是实际的代码失败吗?文本“完成过程”表明它是一个提取。
  • 任何线程涉及?
  • 网络驱动器还是本地?
+0

经过我们几个人的大量挖掘,我们得出这样的结论,即截断是由于在网站的动态内容上启用压缩而导致的。我们已经能够在本地重新创建截断问题,并在禁用压缩时消失。 – 2010-10-12 15:15:33

1

这当然似乎是一个“冲洗”的问题对我来说,即使你说你添加了一个调用flush()。问题可能是您的StreamWriter只是底层FileStream对象的包装。

我通常不使用File.CreateText方法来创建写入文件的流;我通常创建自己的FileStream,如果需要,可以用StreamWriter包装它。无论如何,我遇到了需要在StreamWriter和FileStream上调用Flush的情况,所以我认为这是您的问题。

尝试添加以下代码:

  logWriter.Flush(); 
      if (logWriter.BaseStream != null) 
       logWriter.BaseStream.Flush(); 
+0

我在想同样的事情,但'StreamWriter'正在刷新其Dispose中的底层流。 – 2010-10-07 19:02:39

+0

即使使用FileStream,我也遇到了同样的问题。 – 2014-09-29 16:42:59

3

有时甚至ü调用flush(),它只是不会做的魔力。因为Flush()将导致流写入流中的大部分数据,除了缓冲区的最后一个块。

try 
{ 
// ... write method 
// i dont recommend use 'using' for unmanaged resource 
} 
finally 
{ 
stream.Flush(); 
stream.Close(); 
stream.Dispose(); 
} 
+0

针对我遇到的同样问题提供了出色的解决方案。谢谢@Bonshington – 2012-02-26 13:49:06

+0

你救了我的命:)谢谢 – TMMDev 2016-01-23 17:13:32

0

我面临同样的问题

继为我工作

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

这里有什么修复? – user3800527 2018-02-20 09:12:14

15

有一个非常类似的问题我自己。我发现如果在对流进行任何写入之前启用了AutoFlush,并且它开始按预期工作。 logWriter.AutoFlush = true;

+0

这完美地解决了我的问题。可能只是修正了OP提出的问题。 – 2013-03-28 12:00:13

+0

这个问题解决了我的问题:我的StreamWriter在它完成推出最后几行之前正在被扫描[因为它的调用者超出了范围]。 – bunkerdive 2016-03-30 18:59:39

0

这为我做的伎俩:

streamWriter.flush(); 
+0

任何额外的解释都会改善你的答案。 – ryanyuyu 2015-06-10 12:56:24

0

使用框架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. 
    } 
} 

注意还要读取文件宽度相同的编码类型!

相关问题