由于文件正在使用而导致的IOException

时间:2017-02-08 21:39:17

标签: c# datagridview

我遇到一个问题,我知道人们已经在这里问过,但我尝试了他们带来的解决方案,但这没有帮助。

我的问题:我正在使用2种表单在C#中编写程序。我的主窗体用于读取文件.txt并将信息放在DataGridView中:

public void LireFichier()
    {
        DataGridView dataGridView1 = new DataGridView();

        string delimeter = ";";
        string tableName = "Clients";
        string filePath = @"C:...\Clients.txt";

        DataSet dataset = new DataSet();

        using (StreamReader sr = new StreamReader(filePath))
        {
            dataset.Tables.Add(tableName);
            dataset.Tables[tableName].Columns.Add("ID");
            dataset.Tables[tableName].Columns.Add("Name");
            dataset.Tables[tableName].Columns.Add("LastName");
            dataset.Tables[tableName].Columns.Add("Datet");
            dataset.Tables[tableName].Columns.Add("Price");
            dataset.Tables[tableName].Columns.Add("Phone");
            dataset.Tables[tableName].Columns.Add("ID box");

            string allData = sr.ReadToEnd();
            string[] rows = allData.Split("\r".ToCharArray());

            foreach (string r in rows)
            {
                string[] items = r.Split(delimeter.ToCharArray());
                dataset.Tables[tableName].Rows.Add(items);
            }
            this.dataGridView1.DataSource = dataset.Tables[0].DefaultView;
         }

我的第二个表单用于在我的.txt文件中添加客户端:

      private void btn_Confirmer_Click(object sender, EventArgs e)
      {
        string filePath = @"...\Clients.txt";
        Client client = new Client();

        client.Id = idClient++;
        client.Name = tb_name.Text;
        client.LastName = tb_lastName.Text;

        client.Date = dtp_date.Value.ToString("dd-MMM-yyyy");
        client.Price = Convert.ToInt32(tb_price.Text);
        client.Phone = tb_telephone.Text;
        client.ID_Box = Convert.ToInt32(tb_idbox.Text);

        string clientInfo = client.Id.ToString() + ";" + client.Name.ToString() + ";" + client.LastName.ToString() + ";" + client.Date.ToString() + ";" +
                            client.Montant.ToString() + ";" + client.Phone.ToString() + ";" + client.ID_Boc.ToString() + ";";

        using (StreamReader sr = new StreamReader(filePath))
        {
            string allData = sr.ReadToEnd() + clientInfo;
            File.WriteAllText(filePath, allData);
        }

        this.Close();
      }

问题仍然存在于StreamReader或File.WriteAllText中,无论我做什么,我总是遇到同样的异常(System.IO.IOException),当我到达写入(添加客户端)时我的文件正在使用以我的第二种形式提交。

我尝试的解决方案是:

  1. 放入使用块
  2. sr.Close()
  3. sr.Dispose()即使我知道最后使用块调用处理。
  4. sr.Close()和sr.Dispose()在指令的末尾。

4 个答案:

答案 0 :(得分:2)

尝试更改为以下内容,因为我认为写入会干扰您正在执行的读取。

string allData; 
using (StreamReader sr = new StreamReader(filePath))
{
    allData = sr.ReadToEnd() + clientInfo;
}

this.Close();
File.WriteAllText(filePath, allData);

答案 1 :(得分:1)

Trelly表示您遇到问题的最可能原因(文件已在使用中)。但是,包含异常处理的解决方案应如下所示:

try 
{
    string allData = null; 
    using (var sr = new StreamReader(filePath))
    {
        allData = sr.ReadToEnd() + clientInfo;
    }

    File.WriteAllText(filePath, allData);
}
catch (IOException exc)
{
    // exception handling code
}

this.Close();

看起来您只想在文件末尾添加一些文本。 File.AppendText是你的朋友:

using (StreamWriter sw = File.AppendText(filePath)) 
{
    sw.Write(clientInfo);
}

答案 2 :(得分:0)

要制作代码块thread safe,我会使用lock语句。 首先声明对象,你将执行锁定:

public static readonly Object Locker = new Object();

然后围绕代码部分,使用lock语句处理文件:

lock(Locker)
{
   //perform file operations
}

请记住,两个表单都必须引用相同的Locker对象

答案 3 :(得分:0)

在ReadToEnd之后,在WriteAllText之前关闭StreamReader:

using (StreamReader sr = new StreamReader(filePath))
{
    string allData = sr.ReadToEnd() + clientInfo;
    sr.Close() ; // <---- add this instruction
    File.WriteAllText(filePath, allData);
}