如何将目录列表保存到xml文件C#

发布于 2024-10-26 08:12:43 字数 3376 浏览 6 评论 0原文

我已经到处寻找这个了。可能是我在搜索中输入了错误的内容,我不确定。因此,如果您知道一个好的教程或示例,请分享。我正在努力学习。

我正在开发一个 C# Windows 窗体应用程序。我将信息(在本例中为电影)保存在 XML 文件中。我这样保存了xml文件。

//Now we add new movie.
            XmlElement nodRoot = doc.DocumentElement;
            string allMyChildren = nodRoot.InnerText;
            string capitalized = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(movieEditNameTextbox.Text);
            int indexLookForNewMake = allMyChildren.IndexOf(capitalized);
            if (indexLookForNewMake >= 0)
            {
                MessageBox.Show("Movie is already saved.", "Error");
            }
            else
            {
                XmlElement el = doc.CreateElement("Name");
                el.InnerText = capitalized;
                doc.DocumentElement.AppendChild(el);
                //Check if Year is really a Number.
                if (movieEditYearTextbox.Text.All(Char.IsDigit))
                {
                    //Remove ' cause it gives errors.
                    string capitalizedFixed = capitalized.Replace("'", "");
                    string capitalizedFinalFixed = capitalizedFixed.Replace("\"", "");
                    //Assign Attribute to each New one.
                    el.SetAttribute("Name", capitalizedFinalFixed);
                    el.SetAttribute("Type", movieEditTypeDropdown.Text);
                    el.SetAttribute("Year", movieEditYearTextbox.Text);
                    //Reset all fields, they don't need data now.
                    movieEditNameTextbox.Text = "";
                    movieEditYearTextbox.Text = "";
                    movieEditTypeDropdown.SelectedIndex = -1;
                    removeMovieTextbox.Text = "";

                    doc.Save("movie.xml");

                    label4.Text = "Movie Has been Edited";
                    loadXml();
                }
                else
                {
                    //Error out. Year not a Number
                    MessageBox.Show("Check movie year. Seems it isn't a number.", "Error");
                }
            }

一切都很好。现在我想做的是让你可以选择一个目录,它搜索目录和子目录并获取文件名并将它们保存到 XML 文件中。

我用它来尝试实现这一目标。它确实会拉列表。但这并不能拯救它。它不保存新信息。

我无法使用 LINQ,因为它会因某种原因与其他代码发生冲突。

DirectoryInfo dirCustom = new DirectoryInfo(@"D:\Video");
        FileInfo[] filCustom;
        filCustom = dirCustom.GetFiles("*",SearchOption.AllDirectories);

        //Open XML File.
        XmlDocument doc = new XmlDocument();
        doc.Load("movie.xml");

        XmlElement el = doc.CreateElement("Name");
        string fulCustoms = filCustom.ToString();

        foreach (FileInfo filFile in filCustom)
        {
            string capitalized = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(filFile.Name);
            string capitalizedFixed = capitalized.Replace("\"", "");
            el.SetAttribute("Name", capitalizedFixed);
            el.SetAttribute("Type", "EDIT TYPE");
            el.SetAttribute("Year", "EDIT YEAR");

            richTextBox1.AppendText(capitalizedFixed + "\r\n");
        }
        doc.Save("movie.xml");

        label4.Text = "Movie Has been Edited";
        loadXml();

现在,richTextBox 确实可以正确显示信息,但不会保存信息。 loadXml() 只是我刷新 datagridview 的笨方法。

我完全迷失了,不知道该向哪里求助。我知道我的编码可能很糟糕,哈哈。我对此很陌生。这是我开发的第一个更复杂的应用程序。

我想不出更多的信息可以帮助您理解我的意思。我希望你能做到。

非常感谢您的帮助。

I have looked all over for this. It could be me just typing the wrong thing in search I'm not sure. So, if you know a good tutorial or example of this please share. I'm trying to learn.

I have a C# Windows Form app I'm working on. I have information (movies in this case) saved in an XML file. I saved the xml file like this.

//Now we add new movie.
            XmlElement nodRoot = doc.DocumentElement;
            string allMyChildren = nodRoot.InnerText;
            string capitalized = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(movieEditNameTextbox.Text);
            int indexLookForNewMake = allMyChildren.IndexOf(capitalized);
            if (indexLookForNewMake >= 0)
            {
                MessageBox.Show("Movie is already saved.", "Error");
            }
            else
            {
                XmlElement el = doc.CreateElement("Name");
                el.InnerText = capitalized;
                doc.DocumentElement.AppendChild(el);
                //Check if Year is really a Number.
                if (movieEditYearTextbox.Text.All(Char.IsDigit))
                {
                    //Remove ' cause it gives errors.
                    string capitalizedFixed = capitalized.Replace("'", "");
                    string capitalizedFinalFixed = capitalizedFixed.Replace("\"", "");
                    //Assign Attribute to each New one.
                    el.SetAttribute("Name", capitalizedFinalFixed);
                    el.SetAttribute("Type", movieEditTypeDropdown.Text);
                    el.SetAttribute("Year", movieEditYearTextbox.Text);
                    //Reset all fields, they don't need data now.
                    movieEditNameTextbox.Text = "";
                    movieEditYearTextbox.Text = "";
                    movieEditTypeDropdown.SelectedIndex = -1;
                    removeMovieTextbox.Text = "";

                    doc.Save("movie.xml");

                    label4.Text = "Movie Has been Edited";
                    loadXml();
                }
                else
                {
                    //Error out. Year not a Number
                    MessageBox.Show("Check movie year. Seems it isn't a number.", "Error");
                }
            }

That all works fine. Now what I'm trying to do is make it where you can choose a directory, and it search the directory and sub directories and get file names and save them into the XML file.

I used this to try to accomplish this. It does pull the list. But it doesn't save it. It don't save the new information.

I can't use LINQ as it cause a confliction for some reason with other code.

DirectoryInfo dirCustom = new DirectoryInfo(@"D:\Video");
        FileInfo[] filCustom;
        filCustom = dirCustom.GetFiles("*",SearchOption.AllDirectories);

        //Open XML File.
        XmlDocument doc = new XmlDocument();
        doc.Load("movie.xml");

        XmlElement el = doc.CreateElement("Name");
        string fulCustoms = filCustom.ToString();

        foreach (FileInfo filFile in filCustom)
        {
            string capitalized = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(filFile.Name);
            string capitalizedFixed = capitalized.Replace("\"", "");
            el.SetAttribute("Name", capitalizedFixed);
            el.SetAttribute("Type", "EDIT TYPE");
            el.SetAttribute("Year", "EDIT YEAR");

            richTextBox1.AppendText(capitalizedFixed + "\r\n");
        }
        doc.Save("movie.xml");

        label4.Text = "Movie Has been Edited";
        loadXml();

Now, the richTextBox does display the information correctly but it don't save it.
The loadXml() is just my noobish way to refresh the datagridview.

I'm completely lost and don't know where to turn to. I know my coding is probarely horrible, lol. I'm new to this. This is my first more complex application I have worked on.

I can't think of anymore information that would help you understand what I mean. I hope you do.

Thank you so much for your help.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

冷情妓 2024-11-02 08:12:43

不确定您的 LoadXML() 方法到底是做什么的,但我对您的问题的唯一建议是改变您实现此功能的方式。

创建一个名为 Movie 的对象

public class Movie 
{
    public Movie() {}
    public String Title { get; set; }
    blah... blah...
}

然后创建一个 MovieList

public class MovieList : List<Movie> { }

然后在 MovieList 中实现以下 2 个方法。

public static void Serialize(String path, MovieList movieList)
{
    XmlSerializer serializer = new XmlSerializer(typeof(MovieList));

    using (StreamWriter streamWriter = new StreamWriter(path))
    {
       serializer.Serialize(streamWriter, movieList);
    }
}

public static MovieList Deserialize(String path)
{
    XmlSerializer serializer = new XmlSerializer(typeof(MovieList));
    using (StreamReader streamReader = new StreamReader(path))
    {
        return (MovieList) serializer.Deserialize(streamReader);
    }
}

就是这样...您现在已经序列化了对象,并且可以通过绑定或您选择的任何其他方法检索要填充的数据。

Not sure exactly what your LoadXML() method does but my only piece of advise with your issue is to change the way you are implementing this functionality.

Create an object called Movie

public class Movie 
{
    public Movie() {}
    public String Title { get; set; }
    blah... blah...
}

Then create a MovieList

public class MovieList : List<Movie> { }

Then implement the following 2 methods inside the MovieList.

public static void Serialize(String path, MovieList movieList)
{
    XmlSerializer serializer = new XmlSerializer(typeof(MovieList));

    using (StreamWriter streamWriter = new StreamWriter(path))
    {
       serializer.Serialize(streamWriter, movieList);
    }
}

public static MovieList Deserialize(String path)
{
    XmlSerializer serializer = new XmlSerializer(typeof(MovieList));
    using (StreamReader streamReader = new StreamReader(path))
    {
        return (MovieList) serializer.Deserialize(streamReader);
    }
}

Thats it... You now have your object serialized and you can retrieve the data to populate through binding or whatever other methods you choose.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文