方法似乎正在停止将数据保存到文本文件
本文关键字:保存 数据 文本 文件 方法 | 更新日期: 2023-09-27 18:02:55
我有一个程序,用户可以将产品添加到系统中,然后按产品名称搜索它们。一切正常,只是目前无法输入两个名称相同的产品。我需要程序不允许这种情况。
我有一个分配给"添加"按钮的方法,它将产品名称,客户名称和固件位置保存到文本文件中。下面是这个方法:
private void button_Click(object sender, RoutedEventArgs e)
{
bool found = false;
string searchTerm = productNameTextBox.Text.ToUpper();
if ((productNameTextBox.Text == "") || (customerNameTextBox.Text == "") || (firmwareLocationTextBox.Text == ""))
{
MessageBox.Show("Please fill in all the text boxes");
}
else if (Contains(searchTerm) == true)
{
MessageBox.Show("Product already added");
}
else
{
string inputCustomerName = customerNameTextBox.Text.ToUpper();
string inputProductName = productNameTextBox.Text.ToUpper();
string inputFirmwareLocation = firmwareLocationTextBox.Text;
try
{
Product newProduct = new Product(inputProductName, inputCustomerName, inputFirmwareLocation);
newProduct.Save("Products.txt");
File.AppendAllText("ProductNames.txt", inputProductName + Environment.NewLine);
MessageBox.Show("Product added");
emptyTheTextBoxes();
}
catch
{
MessageBox.Show("Product could not be added");
}
}
}
我还做了一个方法,它将搜索文本文件,看看用户的产品名称是否已经存储,然后返回一个布尔值。这是方法:
public bool Contains (string searchTerm)
{
string line;
bool found = false;
System.IO.StreamReader file = new System.IO.StreamReader("ProductNames.txt");
while ((line = file.ReadLine()) != null)
{
if (line.Contains(searchTerm))
{
found = true;
break;
}
}
if (found == true)
{
return true;
}
else
{
return false;
}
file.Close();
}
当我尝试保存输入时,出现一个消息框,说"产品无法添加"。但是,如果我注释掉调用该方法的else if语句,它会正常工作。
我认为这可能是因为当方法被调用时我打开了文件,也许它没有正确关闭。所以我添加了'file.Close()',这并没有什么不同。我觉得我好像在某个地方犯了一个愚蠢的错误,但这已经困扰了我好几个小时了!绝对感谢一双新鲜的眼睛!
谢谢露西
一般来说,我建议您将对象的持久性从对象/数据管理中分离出来。
您正在尝试在程序的不同部分读取和写入相同文件的文件系统,似乎您遇到了文件未被释放的问题,可能是因为您没有正确关闭它。
您试图将文件系统视为数据库,这可能不是最好的方法。当然,有些用例可能需要这样做。
我建议采用以下方法:
- 在启动过程中读取文件。将产品加载到集合中保存在内存中。
- 允许程序读取、更新、创建、删除产品收集。
- 关机时(也可以手动触发,如果你想),保存
这将允许您避免此类问题。而且还要更快。
您也可以选择使用HashSet<T>
之类的东西作为您的集合。这不允许重复条目(记住在Product对象中重写等号和哈希码)。然后,当尝试添加到集合时,如果返回false,则未添加,这将表示重复。因此,这可能会使您的检查更容易,更快捷。
我把file.close()放在了错误的位置。这里是我移动到的位置:
public bool Contains (string searchTerm)
{
string line;
bool found = false;
System.IO.StreamReader file = new System.IO.StreamReader("ProductNames.txt");
while ((line = file.ReadLine()) != null)
{
if (line.Contains(searchTerm))
{
found = true;
break;
}
}
file.Close();
if (found == true)
{
return true;
}
else
{
return false;
}
}