0

这真的很奇怪。我正在编写一个编写 XML 文件的应用程序。但是,在某些情况下,不会创建/覆盖该文件。

我设法追踪导致它无法写入所需的特定事件,并将其分离成一个独立的程序:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        bool doFileOpenFirst = false;

        if (doFileOpenFirst)
        {
            OpenFileDialog dialog = new OpenFileDialog();

            dialog.CheckFileExists = true;
            dialog.Filter = "Image files|*.bmp;*.jpg;*.png";

            dialog.ShowDialog();
        }

        // Just write a trivial XML file
        XmlDocument doc = new XmlDocument();
        XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "UTF-8", null);
        doc.AppendChild(dec);// Create the root element

        XmlElement root = doc.CreateElement("Database");
        doc.AppendChild(root);

        doc.Save("Trivial.xml");
    }
}

现在,如果您运行它,您将看到它最初是有效的。现在使 doFileOpenFirst 为真。在它写入 XML 之前,它会显示一个用于打开文件的对话框。如果您使用此对话框选择文件(任何文件;不是“Trivial.xml”),之后的 XML 保存将失败。默默。如果您在 OpenFileDialog 中点击取消,保存将正常工作。

所以这里的文件句柄可能存在一些问题,但解决方法是什么?您会看到强制 Dispose 的 OpenFileDialog 没有帮助。

4

3 回答 3

1

您的对话框 (OpenFileDialog) 和您的 XML 保存代码彼此独立。因此,无论是否显示对话框都不会导致 XML 保存问题,尤其是在对话框中选择其他文件时。

另外为了帮助您,我已经检查了您的代码和步骤,并且无论是否使用 OpenFileDialog,XML 都在保存。因此,假设您的问题不取决于打开文件对话框。在您提供的样本中没有问题。

于 2012-10-07T13:17:49.150 回答
1

似乎工作正常!我尝试并按预期工作。

打开随机图像文件没有问题:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;

namespace StackOverflow
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        bool doFileOpenFirst = true;

        if (doFileOpenFirst)
        {
            OpenFileDialog dialog = new OpenFileDialog();

            dialog.CheckFileExists = true;
            dialog.Filter = "Image files|*.bmp;*.jpg;*.png";

            dialog.ShowDialog();
        }

        // Just write a trivial XML file
        XmlDocument doc = new XmlDocument();
        XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "UTF-8", null);
        doc.AppendChild(dec);// Create the root element

        XmlElement root = doc.CreateElement("Database");
        doc.AppendChild(root);

        doc.Save("Trivial.xml");
    }
}
}
于 2012-10-07T13:21:44.517 回答
1

我认为您应该放置这些打开对话框并将xml保存到Form的加载事件中的代码。

于 2012-10-07T13:09:23.423 回答