方法似乎正在停止将数据保存到文本文件

本文关键字:保存 数据 文本 文件 方法 | 更新日期: 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()',这并没有什么不同。我觉得我好像在某个地方犯了一个愚蠢的错误,但这已经困扰了我好几个小时了!绝对感谢一双新鲜的眼睛!

谢谢露西

方法似乎正在停止将数据保存到文本文件

一般来说,我建议您将对象的持久性从对象/数据管理中分离出来。

您正在尝试在程序的不同部分读取和写入相同文件的文件系统,似乎您遇到了文件未被释放的问题,可能是因为您没有正确关闭它。

您试图将文件系统视为数据库,这可能不是最好的方法。当然,有些用例可能需要这样做。

我建议采用以下方法:

  1. 在启动过程中读取文件。将产品加载到集合中保存在内存中。
  2. 允许程序读取、更新、创建、删除产品收集。
  3. 关机时(也可以手动触发,如果你想),保存

这将允许您避免此类问题。而且还要更快。

您也可以选择使用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;
        }
    }