0

我正在从DataGridView. 当我在此过程中打开文件时(当任务正在写入文件时)我收到一个错误,因为:

The process cannot access the file 'xyz\filename.csv' because it is being used by another process.

我已经尝试在每次写入后手动调用该Flush()方法,file但仍然出现错误。swOut

我需要使用FileMode.Append,因为创建文件后我添加了 n 行。我已经尝试了每个不同的FileShare枚举选项,但没有任何效果。

我哪里错了?

我的代码:

using (FileStream file = new FileStream(output_file, FileMode.Append, FileAccess.Write, FileShare.Read))
{
    StreamWriter swOut = new StreamWriter(file);
    swOut.AutoFlush = true;
    if (table.Rows.Count == 2)
    {
        for (int i = 0; i <= table.Columns.Count - 1; i++)
        {
            if (i > 0)
            {
                swOut.Write(",");
            }
            swOut.Write(table.Columns[i].HeaderText);
        }
        swOut.WriteLine();
    }
    swOut.Write(category.Replace(",", " ") + "," + name.Replace(",", " ") + "," + address.Replace(",", " ") + "," + locality.Replace(",", " ") + "," + cap.Replace(",", " ") + "," + tel.Replace(",", " ") + "," + fax.Replace(",", " ") + "," + www.Replace(",", " ") + "," + email_results.Replace(",", " ") + "," + business_url.Replace(",", " ") + "," + map_query.Replace(",", " "));
    swOut.WriteLine();
    file.Close();
    if (stop == true) output_file = "";
}
4

3 回答 3

1

为什么file.Close();

它应该是swOut.Close();

编辑:

或者像这样

'using (FileStream file = new FileStream(output_file, FileMode.Append, FileAccess.Write, FileShare.Read))
using (StreamWriter swOut = new File.AppendText(output_file))
{
    'StreamWriter swOut = new StreamWriter(file);
    swOut.AutoFlush = true;
    if (table.Rows.Count == 2)
    {
        for (int i = 0; i <= table.Columns.Count - 1; i++)
        {
            if (i > 0)
            {
                swOut.Write(",");
            }
            swOut.Write(table.Columns[i].HeaderText);
        }
        swOut.WriteLine();
    }
    swOut.Write(category.Replace(",", " ") + "," + name.Replace(",", " ") + "," + address.Replace(",", " ") + "," + locality.Replace(",", " ") + "," + cap.Replace(",", " ") + "," + tel.Replace(",", " ") + "," + fax.Replace(",", " ") + "," + www.Replace(",", " ") + "," + email_results.Replace(",", " ") + "," + business_url.Replace(",", " ") + "," + map_query.Replace(",", " "));
    swOut.WriteLine();
    swOut.Close();
    if (stop == true) output_file = "";
}
于 2013-06-17T02:38:22.343 回答
0

确保使用代码中的文档的所有文件流都使用关闭

      Close();

例子 :

    //Create the File
    FileStream FS = new FileStream("C:/Path to document",FileMode.Append,FileAccess.Write);
    //Call the Close Method to Close the file
    FS.Close();

确保所有文件流都已关闭,您将不再收到此错误

于 2013-06-16T19:38:47.170 回答
0

好的,这里是解决方案。

在我宣布之前

public FileStream file;

在主班。

然后当它开始向datagridview添加行时,我初始化文件流:

file = new FileStream(output_file, FileMode.Append, FileAccess.Write, FileShare.Read);

然后每次我添加一行时,我也在 csv 中使用以下代码添加一行:

 StreamWriter swOut =  new StreamWriter(file);
                        swOut.AutoFlush = true;
                        if (table.Rows.Count == 2)
                        {
                            for (int i = 0; i <= table.Columns.Count - 1; i++)
                            {
                                if (i > 0)
                                {
                                    swOut.Write(",");
                                }
                                swOut.Write(table.Columns[i].HeaderText);
                            }
                            swOut.WriteLine();
                        }
                        swOut.Write(category.Replace(",", " ") + "," + name.Replace(",", " ") + "," + address.Replace(",", " ") + "," + locality.Replace(",", " ") + "," + cap.Replace(",", " ") + "," + tel.Replace(",", " ") + "," + fax.Replace(",", " ") + "," + www.Replace(",", " ") + "," + email_results.Replace(",", " ") + "," + business_url.Replace(",", " ") + "," + map_query.Replace(",", " "));
                        swOut.WriteLine();
                        swOut.Close();
                        file.Close();
                        file = new FileStream(output_file, FileMode.Append, FileAccess.Write, FileShare.Read);
                        //file.Lock(0, file.Length);

所以 FileStream 总是打开的,它不会像我的原始代码那样每次都关闭。

谢谢!

于 2013-06-17T10:50:53.523 回答