【问题标题】:An unhandled exception of type 'System.IO.IOException'.The process cannot access the file because it is being used by another process“System.IO.IOException”类型的未处理异常。该进程无法访问该文件,因为它正被另一个进程使用
【发布时间】:2018-07-01 14:34:07
【问题描述】:

我正在尝试编写一个程序来从 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());
    }

}

【问题讨论】:

  • 你试过清洗溶液了吗?在我看来,您的目录存在问题,来自移动项目。你确保你所有的 dll 都有正确的路径吗?
  • @InBetween 不,我不知道。我的主程序类有一个从 csv 读取并在开始时调用 WriteHeader 以创建输出文件和 AppendRow 的函数,每次需要将一行添加到结果中

标签: c# file csv io


【解决方案1】:

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

【讨论】:

  • 天哪,非常感谢。我删除了 StreamWriter 引用,它就像一个魅力。代码在我的 mac 项目上运行而不是在我的 windows 机器上运行的任何原因?
  • 首先,.net 和 .net 核心框架的不同实现。然后,不同的操作系统处理文件的方式不同,所以很难说为什么它在 MAC 上工作。对于 Windows - StreamWriter 实例在内部保存一个带有 FileShare.Read 的 FileStream,因此任何其他写入都会失败。 referencesource.microsoft.com/#mscorlib/system/io/…
【解决方案2】:

您的类继承自 System.IO.StreamWriter。当您使用文件名参数调用构造函数时,您也在使用 this(filename) 调用 StreamWriter 构造函数。使用该命令,您可以创建 StreamWriter 类的实例,该实例可以访问该文件,只要您不释放或关闭它即可。这就是您的 File.WriteAllText 命令每次都会失败的原因。你的类继承自 StreamWriter 有什么原因吗? File.WriteAllText 没有它也可以工作。

更新 1

我的回答有点晚了。

【讨论】:

  • 是的,我意识到为时已晚,回首往事,我觉得这很愚蠢。在切换到 System.IO.File 之前,我一直在使用 StreamWriter,并且没有考虑删除继承,因为当我编写代码并在我的 Mac 上对其进行测试时它运行良好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
相关资源
最近更新 更多