1

我有一个程序,我可以在其中添加汽车后备箱销售列表,并指定它们是否用于慈善等。还有一个按钮可以生成用于慈善机构和非慈善机构的汽车后备箱销售列表到不同的文本文件。当我将慈善靴销售添加到应用程序并生成列表时,它会很好地写入文件。但是,当我再次加载应用程序并尝试生成文件时,它会生成一个空白列表。(我有在退出时保存应用程序数据并在启动时重新加载数据的功能)。

我不确定为什么会发生这种情况?

这是用于生成文件列表的按钮背后的代码:

        List<CarBootSale> carbootsales = carBootSaleList.ReturnList();
        carbootsales.Sort(delegate(CarBootSale bs1, CarBootSale bs2)
        {
            return Comparer<string>.Default.Compare(bs1.ID, bs2.ID);
        });
        textReportGenerator.GenerateCharityReport(carbootsales, AppData.CHARITY);
        MessageBox.Show("All the Charity Car Boot Sales have been written to the report file: " + AppData.CHARITY);

下面是生成报告的 TextReportGenerator 类中的代码:

        FileStream outFile;
        StreamWriter writer;

        //create the file and write to it
        outFile = new FileStream(filePath, FileMode.Create, FileAccess.Write);
        writer = new StreamWriter(outFile);

        //For each object in the list, add it to the file
        foreach (CarBootSale obj in CharityList)
        {
            if (obj.Charity == "true")
            {
                writer.WriteLine(obj.Display());
            }
        }
        //close the file which has been opened
        writer.Close();
        outFile.Close();
4

1 回答 1

1

您的代码在很大程度上看起来不错(注意:见下文),因此如果没有整个代码在本地运行,我无法给出具体建议,除了使用using.

考虑使用这样的代码:

    using(FileStream outFile = new FileStream(filePath, FileMode.Create, FileAccess.Write))
    using(StreamWriter writer = new StreamWriter(outFile)) {

        //For each object in the list, add it to the file
        foreach (CarBootSale obj in CharityList) {
            if (obj.Charity == "true") {
                writer.WriteLine(obj.Display());
            }
        }

    }

Display我的猜测是您的方法中有一个未处理的异常,因此您的调用.Close将永远不会进行,因此数据永远不会从缓冲区刷新到磁盘。使用using块可确保无论发生什么(异常或过早return),您的流缓冲区都将写入磁盘而不会丢失任何数据。

一件小事:为什么是.Charity字符串?为什么它不是一个booleanenum属性?

于 2013-03-01T22:44:18.737 回答