我正在尝试编写一个程序来读取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());
}
}
答案 0 :(得分:3)
您正在派生StreamWriter,这将打开该文件。 您应该使用StreamWriter(基本)方法来编写内容,而不是使用File.WriteAllText。 或者不要派生StreamWriter。
答案 1 :(得分:1)
您的类继承自System.IO.StreamWriter。当您使用filename参数调用构造函数时,您也使用this(filename)调用StreamWriter构造函数。使用该命令,您可以创建一个StreamWriter类的实例,只要您不处理或关闭它就可以访问该文件。这就是为什么每次File.WriteAllText命令都会失败的原因。你的类是否继承了StreamWriter是否有任何理由? File.WriteAllText没有它。
更新1
我的回答有点迟了。