该进程无法访问该文件,因为它已被另一个进程使用

时间:2018-10-08 14:48:22

标签: c# csv streamreader streamwriter

我在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()
{
}

2 个答案:

答案 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语句中。您正在有效地尝试从当前正在写入的文件中读取数据。