使用StreamWriter和StreamReader导致错误" Stream不可读"

时间:2014-09-15 09:45:05

标签: c# csv streamreader streamwriter

我正在尝试将数据保存到csv文件,但希望确保我要保存的数据不会在csv文件中存在。因此,我想首先读取文件,然后保存数据。

FileStream writer = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite);
FileStream reader = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

        using (StreamWriter sw = new StreamWriter(writer))
        {
            if (response.Datapoints.Count != 0)
            {
                foreach (var datapoint in response.Datapoints)
                {
                    sb = new StringBuilder();
                    toBeSaved = new string[] { nameSpace, metric, instanceId, datapoint.Timestamp.ToString()};

                    foreach (string str in toBeSaved)
                    {
                        if (str == toBeSaved.Last())
                        {
                            sb.Append(str);
                        }
                        else
                        {
                            sb.Append(str);
                            sb.Append(",");
                        }
                    }
                    // here I get the error that the "Stream is not Readable"
                    using (StreamReader sr = new StreamReader(reader))
                    {
                        if (sr.ReadLine() != sb.ToString())
                        { // only write the data if it is not already there in the file
                            sw.WriteLine(sb.ToString());
                        }
                    }
                }

2 个答案:

答案 0 :(得分:2)

此using语句将处理reader

  using (StreamReader sr = new StreamReader(reader))

处置StreamReader也会处置reader。 当你访问它时,下一个循环迭代它被处理,因此出现错误消息。

您可以通过在每次循环迭代中创建一个新的FileStream读取器,或者通过重用StreamReader并在循环之后处理它来规避这一点。

我会使用不同的方法,这可能会更高效。

除非您的输入文件非常大,否则请在开头将其完全读入内存:

 var lines = File.ReadLines();

然后在写入csv文件之前:

 if(!lines.Contains(sb.ToString())
    sw.WriteLine(sb.ToString());

答案 1 :(得分:1)

假设您使用的是.Net 4.5或更高版本,可以在StreamReader构造函数中设置它以保持流打开:

http://msdn.microsoft.com/en-us/library/gg712952(v=vs.110).aspx

public StreamReader(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int bufferSize, bool leaveOpen)