【发布时间】:2015-06-24 16:31:33
【问题描述】:
我创建了一个类,负责生成一个文本文件,其中每一行代表“MyDataClass”类对象的信息。下面是我的代码的简化:
public class Generator
{
private readonly Stream _stream;
private readonly StreamWriter _streamWriter;
private readonly List<MyDataClass> _items;
public Generator(Stream stream)
{
_stream = stream;
_streamWriter = new StreamWriter(_stream, Encoding.GetEncoding("ISO-8859-1"));
}
public void Generate()
{
foreach (var item in _items)
{
var line = AnotherClass.GetLineFrom(item);
_streamWriter.WriteLine(line);
}
_streamWriter.Flush();
_stream.Position = 0;
}
}
我这样称呼这个类:
using (var file = new FileStream("name", FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
new Generator(file).Generate();
}
当我在 Visual Studio 上运行应用程序时(我使用运行 (Ctrl+F5)、调试 (F5)、调试和发布模式进行测试)一切都按计划进行。但是我在 IIS 服务器中发布了应用程序,现在 StreamWriter 类在行尾之前放置了一个额外的 \r 。
查看两个生成文件的十六进制读数:
在 Visual Studio 中运行: http://www.jonataspiazzi.xpg.com.br/hex_vs.bmp
在 IIS 中运行: http://www.jonataspiazzi.xpg.com.br/hex_iis.bmp
我已经检查过的一些事情:
在日志中写入
line变量(在var line = AnotherClass.GetLineFrom(item);中)以查看额外的'\r' 是否被AnotherClass类排除。
没有产生任何结果,line 中的最后一个字符是预期的常规字符(在上面的示例中是一个空格)。
编写另一个代码,看看问题是否对所有 IIS StreamWriter 实例都普遍存在。
我试过了:
var ms = new MemoryStream();
var sw = new StreamWriter(ms, Encoding.GetEncoding("ISO-8859-1"));
sw.WriteLine("Test");
sw.WriteLine("Of");
sw.WriteLine("Lines");
sw.Flush();
ms.Position = 0;
在这种情况下,代码适用于 Visual Studio 和 IIS。
我在这里待了 3 天,我已经尝试了我的大脑能想到的一切。有人知道我可以尝试什么吗?
更新
变得更奇怪!我尝试将_streamWriter.WriteLine(line); 行替换为:
_streamWriter.Write(linhaTexto + Environment.NewLine);
更糟糕的是:
_streamWriter.Write(linhaTexto + "\r\n");
两者都不断生成额外的\r 字符。
我尝试用这个替换:
_streamWriter.Write(linhaTexto + "#\r\n#");
得到:
【问题讨论】:
-
如果您尝试删除编码会发生什么?
-
错误仍然存在。我尝试了不编码,
Defaul,UTF8和"ISO-8859-15"。都给我同样的结果。 -
是否有可能在从服务器传输文件的过程中添加了额外的\r?
-
文件保存在一个文件夹中,我通过 FTP 获取它。
-
哦..这可能是你的问题
标签: c# .net visual-studio-2010 iis streamwriter