我正在尝试将数据保存到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());
}
}
}
答案 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)