类型为“System.IO.IOException”的未处理异常。该进程无法访问该文件,因为该文件正由另一个进程

时间:2018-01-22 21:20:44

标签: c# file csv io

我正在尝试编写一个程序来读取csv文件中的记录,处理它们并将结果写入新文件。为此,我构建了一个名为CsvWriter的类,它在读取主csv文件时处理标题的写入和追加行。最初我在我的Mac上工作,我在使用这个类时没有得到任何错误,但当我切换到windows(制作一个Windows窗体应用程序)时,我一直在

  

mscorlib.dll中出现未处理的“System.IO.IOException”类型异常

     

其他信息:进程无法访问文件“C:\ Users \ user \ Documents \ correct-list.csv”,因为它正由另一个进程使用。

我遇到的错误是在以下行的CsvWriter类中:

File.WriteAllText(filename, builder.ToString());

我以为使用System.IO.File.WriteAllText会自动刷新并关闭文件。我找不到任何其他错误来源。 感谢您解决此错误的任何帮助。

这是我的代码:

public class CsvWriter : StreamWriter
{
    private string filename;

    /// <summary>
    /// Initializes a new instance of the <see cref="T:USPSAddressVerification.CsvWriter"/> class.
    /// </summary>
    /// <param name="filename">Filename of the csv file to write on.</param>
    public CsvWriter(string filename) : base(filename)
    {
        this.filename = filename;
    }

    /// <summary>
    /// Writes the header in the csv file.
    /// </summary>
    /// <param name="headers">Array of Headers.</param>
    /// <param name="addHeaders">Add additional headers to the csv file.</param>
    public void WriteHeader(List<string> headers)
    {
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < headers.Count; i++)
        {
            if (i < headers.Count - 1) builder.Append("\"" + headers[i] + "\",");
            else builder.Append("\"" + headers[i] + "\"\n");
        }
        File.WriteAllText(filename, builder.ToString());
    }

    /// <summary>
    /// Appends the row to the csv file.
    /// </summary>
    /// <param name="row">Row to be appended.</param>
    public void AppendRow(List<string> row)
    {
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < row.Count; i++)
        {
            if (i < row.Count - 1) builder.Append("\"" + row[i] + "\",");
            else builder.Append("\"" + row[i] + "\"\n");
        }
        File.AppendAllText(filename, builder.ToString());
    }

}

2 个答案:

答案 0 :(得分:3)

您正在派生StreamWriter,这将打开该文件。 您应该使用StreamWriter(基本)方法来编写内容,而不是使用File.WriteAllText。 或者不要派生StreamWriter。

答案 1 :(得分:1)

您的类继承自System.IO.StreamWriter。当您使用filename参数调用构造函数时,您也使用this(filename)调用StreamWriter构造函数。使用该命令,您可以创建一个StreamWriter类的实例,只要您不处理或关闭它就可以访问该文件。这就是为什么每次File.WriteAllText命令都会失败的原因。你的类是否继承了StreamWriter是否有任何理由? File.WriteAllText没有它。

更新1

我的回答有点迟了。