我遇到一个问题,我知道人们已经在这里问过,但我尝试了他们带来的解决方案,但这没有帮助。
我的问题:我正在使用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),当我到达写入(添加客户端)时我的文件正在使用以我的第二种形式提交。
我尝试的解决方案是:
答案 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);
}