我创建了一个类,负责生成一个文本文件,其中每一行代表一个' 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上运行应用程序时(我使用run(Ctrl + F5)进行测试,调试(F5),使用调试和释放模式)所有都按照计划进行。但是我在IIS服务器上发布了应用程序,现在StreamWriter类在行结束之前添加了一个额外的\ r \ n。
检查两个生成文件的十六进制读数:
在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);
)中写入日志,以查看是否有额外的&#39; \ r&#39;被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#");
得到:
答案 0 :(得分:4)
根据MSDN,WriteLine
将数据后跟行终止符写入文本字符串或流。
你的最后一行应该是
_streamWriter.Write(line);
将它置于循环外部并更改循环,以便它不管理最后一行。
答案 1 :(得分:2)
答案 2 :(得分:1)
我有类似的问题。 Environment.NewLine和WriteLine给了我额外的\ r字符。但下面的内容对我有用:
StringBuilder sbFileContent = new StringBuilder();
sbFileContent.Append(line);
sbFileContent.Append("\n");
streamWriter.Write(sbFileContent.ToString());
答案 3 :(得分:0)
我刚才有一个类似的问题,下面的代码将在输出文件(outFile)中随机插入空白行
using (StreamWriter outFile = new StreamWriter(outFilePath, true)) {
foreach (string line in File.ReadLines(logPath)) {
string concatLine = parse(line, out bool shouldWrite);
if (shouldWrite) {
outFile.WriteLine(concatLine);
}
}
}
使用Antar的想法,我更改了解析函数,以使其返回附加了Environment.NewLine的行,即
return myStringBuilder.Append(Environment.NewLine).ToString();
然后在上面的foreach循环中,更改
outFile.WriteLine(concatLine);
到
outFile.Write(concatLine);
,现在它写入文件时未插入一堆随机的新行。但是,我仍然完全不知道为什么我必须这样做。