如何为指定文件夹创建和保存包含完整文件和文件夹层次结构的 XML 文件?

Posted

技术标签:

【中文标题】如何为指定文件夹创建和保存包含完整文件和文件夹层次结构的 XML 文件?【英文标题】:How to create and save an XML file containing complete hierarchy of files and folders for a specified folder? 【发布时间】:2017-10-23 08:14:21 【问题描述】:

这是我在网站上的第一篇文章 :)

所以基本上我需要一个 gui 应用程序,它可以创建和保存 XML 文件,其中包含指定文件夹的完整文件和文件夹层次结构。

1.每个文件夹应包含:文件夹名称、文件夹大小(字节)和文件数。

2.每个文件都应包含:文件名、文件大小(字节)、文件创建、文件上次访问时间、文件上次修改时间。

创建 XML 文件后,应用程序需要显示整个文件夹层次结构树(通过使用 TreeView 类)。

谁能提供帮助和答案?谢谢!

【问题讨论】:

我建议您查看'How to Ask a Question' FAQ。 *** 不是一个代码编写服务,你必须展示你到目前为止所做的尝试。询问具体的编码问题,而不是广泛的要求。 谢谢! :) 感谢您的评论 【参考方案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.IO;
using System.Xml;
using System.Xml.Linq;

namespace WindowsFormsApplication29

    public partial class Form1 : Form
    
        XDocument doc = null;
        public Form1()
        
            InitializeComponent();

            folderBrowserDialog1.SelectedPath = @"c:\temp";

        

        private void buttonBrowseForFolder_Click(object sender, EventArgs e)
        
            folderBrowserDialog1.ShowDialog();
            textBoxFolderName.Text = folderBrowserDialog1.SelectedPath;
        

        private void buttonCreateXml_Click(object sender, EventArgs e)
        
            if(Directory.Exists(textBoxFolderName.Text))
            
                string header = "<?xml version=\"1.0\" encoding=\"utf-8\" ?><Directory></Directory> ";
                doc = XDocument.Parse(header);
                XElement root = doc.Root;

                CreateXmlRecursive(textBoxFolderName.Text, root);
            
        
        private float CreateXmlRecursive(string folder, XElement folderElement)
        
            folderElement.SetValue(folder);

            DirectoryInfo dInfo = new DirectoryInfo(folder);

            int numberOfFiles = 0;
            float size = 0.0f;

            foreach(FileInfo fInfo in dInfo.GetFiles())
            
                try
                
                    float fSize = fInfo.Length;
                    size += fSize;
                    folderElement.Add(new XElement("File", new object[] 
                        new XAttribute("size",fSize),
                        new XAttribute("creationDate", fInfo.CreationTime.ToShortDateString()),
                        new XAttribute("lastAccessDate", fInfo.LastAccessTime.ToShortDateString()),
                        new XAttribute("lastModifiedDate", fInfo.LastWriteTime.ToShortDateString()),
                        fInfo.Name
                    ));
                    numberOfFiles += 1;
                
                catch(Exception e)
                
                    Console.WriteLine("Error : CAnnot Access File '0'", fInfo.Name);
                
            
            foreach(string subFolder in Directory.GetDirectories(folder))
            
                XElement childDirectory = new XElement("Directory");
                folderElement.Add(childDirectory);
                float dSize =  CreateXmlRecursive(subFolder, childDirectory);
                size += dSize;
            
            folderElement.Add(new XAttribute[] 
                new XAttribute("size", size),
                new XAttribute("numberOfFiles", numberOfFiles)
            );

            return size;
        

        private void buttonCreateTree_Click(object sender, EventArgs e)
        
            if (doc != null)
            
                TreeNode rootNode = new TreeNode(doc.Root.FirstNode.ToString());
                AddNode(doc.Root, rootNode);
                treeView1.Nodes.Add(rootNode);
                treeView1.ExpandAll();
            

        
        private void AddNode(XElement xElement, TreeNode inTreeNode)
        

            // An element.  Display element name + attribute names & values.
            foreach (var att in xElement.Attributes())
            
                inTreeNode.Text = inTreeNode.Text + " " + att.Name.LocalName + ": " + att.Value;
            
            // Add children
            foreach (XElement childElement in xElement.Elements())
            
                TreeNode tNode = inTreeNode.Nodes[inTreeNode.Nodes.Add(new TreeNode(childElement.Value))];
                AddNode(childElement, tNode);
            
        

    

【讨论】:

感谢您的回复!代码非常清晰并且写得很好,但我遇到了“folderBrowserDialog1”的问题。你命名为“folderBrowserDialog1”?对不起,如果这个问题有点愚蠢,但我是一个初学者,希望你能理解:))也许是因为我是作为 WPF 而不是 Windows 窗体...... 是对话框下窗体上工具箱中的一个对象。像任何按钮或文本框一样添加它。确保您采用最新的代码。我移动了几行以加快加载树视图。 在 WPF 中使用对象 FolderBrowserDialog 好吧,现在,我可以成功打开我的目录并选择一个文件夹。我对 treeView1.Nodes.Add(rootNode); 有疑问并使用 treeView1.ExpandAll();在我输入 treeView1 后,我无法放置 .Nodes() 或 .ExpandAll()。你认为这是为什么?第二个问题与 string header = " ";我不明白字符串。 你必须先创建xml文件。确保添加库 System.Xml 和 System.Xml.Linq。我将 xml 标识行和根元素“目​​录”添加到 xml。使用 Root 移动到元素目录。【参考方案2】:

你的问题是 - 你能帮我申请吗 - 但无论如何。

我会给你一些提示来开始你的项目。

首先 - 查看MVVM here。这将帮助您 - 处理 WPF

1.选择起始文件夹

那么您需要FolderPicker 来开始您的搜索

  public static string PickFolder()
    
        var dialog = new System.Windows.Forms.FolderBrowserDialog();
        System.Windows.Forms.DialogResult result = dialog.ShowDialog();

        string folder = string.Empty;
        switch (result)
        
            case System.Windows.Forms.DialogResult.OK: return dialog.SelectedPath;
            case System.Windows.Forms.DialogResult.Cancel: return string.Empty;
            default: return string.Empty;
        
    

为此,您将需要System.Windows.Forms 程序集。 (项目 -> 添加引用 -> 组装)

2。文件夹和文件

然后你想遍历所有文件夹。

查看System.IO.Directoryhere

3.文件信息

检查System.IO.File here - 这将为您提供一些文件数据并获取文件大小检查this 输出

【讨论】:

非常感谢您的帮助!我需要学习如何自己做这种事情。为我做一个应用程序太容易和愚蠢了:)

以上是关于如何为指定文件夹创建和保存包含完整文件和文件夹层次结构的 XML 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 EmrCreateJobFlowOperator 指定配置文件?

如何为mongodb数据库创建一个平面文件,以及如何在弹性搜索和kibana中使用该平面文件来查询数据?

如何为 github 和 npm 指定不同的自述文件

在我的 iPhone 文件夹中,如何为我的应用创建文件夹? [iOS 13]

如何为 celery 任务日志指定文件路径?

如何为配置脚本指定包含目录