2017-02-08 3 views
0

私はすでにここで尋ねられた人たちを知っていますが、彼らが持っている解決策を試しましたが、助けにはならないという問題があります。ファイルが使用中であることが原因でIOExceptionが発生しました

私の問題:私は2つのフォームでC#でプログラムをやっています。私のメインフォームは、ファイル.txtは読んでのDataGridViewに情報を置くために使用されます。

 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(); 
     } 

問題:

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; 
     } 

私の2番目の形式は、私の.txtファイルにクライアントを追加するために使用されますStreamReaderまたはFile.WriteAllTextに何が残っていても、私はいつも同じ例外(System.IO.IOException)が発生しています。私のファイルは、私の2番目の形式でファイルに書き込むために到着したときに使用されています。

私が試した解決策は以下のとおりです。

  1. は、私が使用してブロックコールが終わりに処分することがわかっている場合でも
  2. sr.Close()
  3. をsr.Dispose()を使用してブロックを配置しました。
  4. sr.Close()およびsr.Dispose()が命令の最後にあります。
+0

は、これらのブロックが同じ時間に実行されている可能性がありますか?私はファイルが赤色である間に書き込みを試みると例外がスローされることを意味します – tomassino

+0

実際の例外テキストを与えることから始めよう – ColinM

+0

私は関数ReadFile()を呼び出します。私のpublic form1(){}ではInitializeComponent()の前にあります。どこで私のファイルを読んでからファイルを閉じる(少なくとも私は閉じようとした)と私は別のbutton_clickを持っていますそれは私のクライアントを追加することができます私の2番目のフォームを開く –

答えて

2

書き込みが既に実行している読み取りを妨害していると考えているので、以下に変更してみてください。

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

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

'allData'は' using'ブロックのスコープ内で定義されていて、外部では使用できません – ColinM

+0

あまりにも遅く見えましたが、コードブロックの編集が面白かったです:p使用前にallDataを宣言する必要があります何らかの理由でコードブロックはその行を表示しません。そこに行くの...一種。 – Trelly

+0

私はあなたにコードを試みました。元の投稿に記述したとおりに例外を再現できます。変更を試みたところ、問題は解決されました。そして、私は例外を処理する方法についてAlexiに同意します。また、クライアント情報をファイルに追加するだけで、すべてを書き直す必要はありません。 – Trelly

0

コードthread safeのあなたのブロックを作るために、私はlockステートメントを使用します。そして、あなたがロック文でファイルを操作しているコードを、あなたの部分を囲む

public static readonly Object Locker = new Object(); 

: まず宣言オブジェクトは、あなたが上のロックを行います

lock(Locker) 
{ 
    //perform file operations 
} 

両方のフォームを参照する必要があることを忘れないでください同じロッカーオブジェクト

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(); 

OR

あなただけのファイルの最後にいくつかのテキストを追加したいように見えます。 File.AppendTextはあなたの友達です:ReadToEnd後

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

ありがとうございました!AppendTextを使用すると、同じファイルに対して2つのストリームリーダーを使用するときに問題が発生したことを意味するエラーは発生しません –

0

、WriteAllText前のStreamReaderを閉じる:

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