为什么FileStream有时会忽略不可见的字符?

时间:2016-10-26 14:32:24

标签: c# filestream

我有两个代码块,我尝试使用它来从C#中的文件流中读取数据。我的总体目标是尝试将每行文本读入一个字符串列表,但它们都被读入一个字符串(当使用读取+写入访问一起打开时)... < / p>

我注意到第一个代码块正确读入了所有回车和换行符,另一个忽略了它们。我不确定这里到底发生了什么。我以两种不同的方式打开了这些流,但这不是真的很重要吗?好吧,无论如何这里是第一个代码块(正确读入我的空白字符):

StreamReader sr = null;
StreamWriter sw = null;
FileStream fs = null;
List<string> content = new List<string>();
List<string> actual = new List<string>();
string line = string.Empty;

// first, open up the file for reading
fs = File.OpenRead(path);
sr = new StreamReader(fs);

// read-in the entire file line-by-line
while(!string.IsNullOrEmpty((line = sr.ReadLine())))
{
    content.Add(line);
}
sr.Close();

现在,这里是忽略所有空格字符(即换行,回车)的代码块,并在一行中读取整个文件。

StreamReader sr = null;
StreamWriter sw = null;
FileStream fs = null;
List<string> content = new List<string>();
List<string> actual = new List<string>();
string line = string.Empty;

// first, open up the file for reading/writing
fs = File.Open(path, FileMode.Open);
sr = new StreamReader(fs);

// read-in the entire file line-by-line
while(!string.IsNullOrEmpty((line = sr.ReadLine())))
{
    content.Add(line);
}
sr.Close();

为什么Open会导致所有数据都被读取为单行,并且OpenRead正常工作(将数据读取为多行)?

更新1

我被要求提供重现问题的文件的文本。所以它在下面(确保CR + LF在每一行的末尾!!我不确定这是否会粘贴在这里!

;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;$$$$$$$$$                                                                $$$$$$$
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;
;
;

更新2

重现问题的确切代码块(使用上面的文本文件)。在这种情况下,我实际上看到了问题,没有尝试Open而只使用OpenRead

StreamReader sr = null;
StreamWriter sw = null;
FileStream fs = null;
List<string> content = new List<string>();
List<string> actual = new List<string>();
string line = string.Empty;

try
{
    // first, open up the file for reading/writing
    fs = File.OpenRead(path);
    sr = new StreamReader(fs);

    // read-in the entire file line-by-line
    while(!string.IsNullOrEmpty((line = sr.ReadLine())))
    {
        content.Add(line);
    }
    sr.Close();

    // now, erase the contents of the file
    File.WriteAllText(path, string.Empty);

    // make sure that the contents of the file have been erased
    fs = File.OpenRead(path);
    sr = new StreamReader(fs);
    if (!string.IsNullOrEmpty(line = sr.ReadLine()))
    {
        Trace.WriteLine("Failed: Could not erase the contents of the file.");
        Assert.Fail();
    }
    else
    {
        Trace.WriteLine("Passed: Successfully erased the contents of the file.");
    }

    // now, attempt to over-write the contents of the file
    fs.Close();
    fs = File.OpenWrite(path);
    sw = new StreamWriter(fs);
    foreach(var l in content)
    {
        sw.Write(l);
    }

    // read back the over-written contents of the file
    fs.Close();
    fs = File.OpenRead(path);
    sr = new StreamReader(fs);
    while (!string.IsNullOrEmpty((line = sr.ReadLine())))
    {
        actual.Add(line);
    }

    // make sure the contents of the file are correct
    if(content.SequenceEqual(actual))
    {
        Trace.WriteLine("Passed: The contents that were over-written are correct!");
    }
    else
    {
        Trace.WriteLine("Failed: The contents that were over-written are not correct!");
    }
}
finally
{
    // close out all the streams
    fs.Close();

    // finish-up with a message
    Trace.WriteLine("Finished running the overwrite-file test.");
}

1 个答案:

答案 0 :(得分:0)

生成的新文件
foreach(var l in content)
{
    sw.Write(l);
}

不包含行尾字符,因为content中不包含行尾字符。

正如@DaveKidder在this thread over here中指出的那样,spec for StreamReader.ReadLine明确指出结果行不包含行尾。

当你这样做时

while(!string.IsNullOrEmpty((line = sr.ReadLine())))
{
    content.Add(line);
}
sr.Close();

你正在失去行尾字符。