我在C#中遇到的代码写入csv文件时遇到问题(保存来自文本框的输入数据),同时我想向每个保存的新行添加行号。我写了这段代码,但错误显示:Sysytem.IO.IOException'该进程无法访问该文件,因为该文件已被另一个进程使用。 我确保关闭了streamwriter和streamreader。我不知道我还能如何改善我的代码。
var filePath = "csvFile.csv";
using (StreamWriter sw = new StreamWriter(new FileStream(filePath, FileMode.Create, FileAccess.Write)))
try
{
//Count rows in csv file and add new row number
string file = new StreamReader("csvFile.csv").ReadToEnd();
string[] lines = file.Split('\n');
int countOfLines = lines.GetLength(0);
sw.WriteLine("{0},{1},{2},{3},{4},{5}"
, countOfLines + 1
, txtEventName.Text
, txtEventType.Text
, txtAttributeName.Text
, txtAValue.Text
, txtEventDescrip.Text);
// Ensure data is written to disk
sw.Close();
}
catch()
{
}
答案 0 :(得分:0)
您收到此错误(“该进程无法访问该文件,因为该文件已被另一个进程使用”),因为您正在尝试使用StreamReader
再次访问该文件,而StreamWriter
已经打开了该文件。
要解决您的问题,您应该首先在文件中计算多行,然后再在文件中附加新文本。
var countOfLines = File.ReadLines("csvFile.csv").Count();
using (StreamWriter sw =
new StreamWriter(new FileStream(filePath,
FileMode.Create | FileMode.Append, FileAccess.Write)))
try
{
sw.WriteLine("{0},{1},{2},{3},{4},{5}",
countOfLines + 1,
txtEventName.Text
, txtEventType.Text
, txtAttributeName.Text
, txtAValue.Text
, txtEventDescrip.Text);
...
您应注意FileMode
的{{1}}参数。您应该使用FileStream
,如果您留在代码FileMode.Create | FileMode.Append
中,则文件中将始终只有一行数据(msdn)。
答案 1 :(得分:0)
您应在StreamReader
的{{1}}语句之外访问using
实例。它应该在自己的StreamWriter
语句中。您正在有效地尝试从当前正在写入的文件中读取数据。