【问题标题】:the process cannot access the file because it's used by another process [duplicate]该进程无法访问该文件,因为它被另一个进程使用[重复]
【发布时间】:2018-10-08 14:48:22
【问题描述】:

我在写入 csv 文件的 C# 代码中遇到了问题(保存来自文本框的输入数据)。同时我想为每个保存的新行添加行号。我写了这段代码,但错误显示: 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()
{
}

【问题讨论】:

  • 如果您提供完整的代码示例并正确缩进它会有所帮助。
  • CSV 文件永远不会超过一行,因为您总是通过FileMode.Create 创建一个新的。您可能想要做的是使用FileMode.Append 打开文件,您已通过 StreamReader 读取其内容以获取已经存在的行数。但是,请参阅 this answer 以获得更有效的方法来获取当前行数。

标签: c# csv streamreader streamwriter


【解决方案1】:

您应该在StreamWriterusing 语句之外访问您的StreamReader 实例。它应该在它自己的using 语句中。您实际上是在尝试从当前也在写入的文件中读取数据。

【讨论】:

    【解决方案2】:

    您收到此错误(“该进程无法访问该文件,因为它已被另一个进程使用”),因为您正在尝试使用 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);
    ...
    

    您应该注意FileStreamFileMode 参数。您应该使用FileMode.Create | FileMode.Append,如果您在代码中留下FileMode.Create,您的文件中将始终有一行数据(msdn)。

    【讨论】:

    • 谢谢大家,我通过在 StreamWriter 代码之外放置计算 csv 文件行数的代码解决了我的问题: //Count rows in csv file and add new row number var lineCount = 0;使用 (var reader = File.OpenText(@"csvFile.csv")) { while (reader.ReadLine() != null) { lineCount++; } }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    相关资源
    最近更新 更多