Click here to Skip to main content
6,929,899 members and growing! (24,358 online)
Email Password   helpLost your password?
 
Desktop Development » Files and Folders » File System     Intermediate License: The Code Project Open License (CPOL)

XML Directory Tree Generator

By Erhan Hosca

Describes a directory tree documenter that outputs XML.
C#.NET1.0, .NET1.1, Win2K, WinXP, Win2003VS.NET2003, Dev
Posted:17 Sep 2003
Views:63,600
Bookmarked:29 times
printPrint Friendly   add Share
      Discuss Discuss   Broken Article?Report  
9 votes for this article.
Popularity: 3.04 Rating: 3.18 out of 5
3 votes, 33.3%
1

2
1 vote, 11.1%
3
4 votes, 44.4%
4
1 vote, 11.1%
5

Introduction

This code snippet recursively enumerates all the folders and files under a given starting folder and generates an XML document as an output, that represents the same hierarchy as of the traversed directories. The resulting XML document can then be transformed with a simple XSLT transformation to generate the desired output. The main reason for writing this was to display the contents of a given directory on a website, without having to enable directory browsing on the server. I wanted to be able to define certain filter criteria to control the output generated, so it was important to capture as much information pertaining to the folders and files as possible.

Using the code

The code is implemented as FileSystemInfoLister class. The main entry point is the GetFileSystemInfoList() method that returns an XML document. The AddElements() method is called recursively until the entire path is traversed.

using System;
using System.Xml;
using System.IO;


namespace Hosca.FileSystemInfoLister {

    public class FileSystemInfoLister {

        XmlDocument xmlDoc;

        public FileSystemInfoLister() {
            xmlDoc = new XmlDocument();
        }

        public XmlDocument GetFileSystemInfoList(string StartFolder) {

            try{
                XmlDeclaration xmlDec = xmlDoc.CreateXmlDeclaration("1.0", 
                                                                "", "yes");
                xmlDoc.PrependChild ( xmlDec );
                XmlElement nodeElem =  XmlElement("folder",
                         new DirectoryInfo(StartFolder).Name); 
                xmlDoc.AppendChild(AddElements(nodeElem,StartFolder));
            }
            catch(Exception ex) {
                xmlDoc.AppendChild(XmlElement("error",ex.Message));
                return xmlDoc;
            }
            return xmlDoc;
        }


        private XmlElement AddElements(XmlElement startNode, 
                                               string Folder){
            try{
                DirectoryInfo dir = new DirectoryInfo(Folder);
                DirectoryInfo[] subDirs = dir.GetDirectories() ;
                FileInfo[] files = dir.GetFiles();
                foreach(FileInfo fi in files){
                  XmlElement fileElem = XmlElement("file",fi.Name);
                  fileElem.Attributes.Append(XmlAttribute("Extension", 
                                                           fi.Extension));
                  fileElem.Attributes.Append(XmlAttribute("Hidden", 
                   ((fi.Attributes & FileAttributes.Hidden) != 0) 
                                                       ? "Y":"N"));
                  fileElem.Attributes.Append(XmlAttribute("Archive", 
                   ((fi.Attributes & FileAttributes.Archive ) != 0) 
                                                       ? "Y":"N"));
                  fileElem.Attributes.Append(XmlAttribute("System", 
                   ((fi.Attributes & FileAttributes.System ) != 0) 
                                                       ? "Y":"N"));
                  fileElem.Attributes.Append(XmlAttribute("ReadOnly", 
                   ((fi.Attributes & FileAttributes.ReadOnly ) != 0) 
                                                        ? "Y":"N"));
                  startNode.AppendChild(fileElem);
                }
                foreach (DirectoryInfo sd in subDirs) {
                  XmlElement folderElem = XmlElement("folder",sd.Name);
                  folderElem.Attributes.Append(XmlAttribute("Hidden", 
                    ((sd.Attributes & FileAttributes.Hidden) != 0) 
                                                       ? "Y":"N"));
                  folderElem.Attributes.Append(XmlAttribute("System", 
                    ((sd.Attributes & FileAttributes.System  ) != 0) 
                                                       ? "Y":"N"));
                  folderElem.Attributes.Append(XmlAttribute("ReadOnly",
                    ((sd.Attributes & FileAttributes.ReadOnly ) != 0)
                                                       ? "Y":"N"));
                  startNode.AppendChild(AddElements(folderElem,
                                                     sd.FullName));
                }
                return startNode;
            }
            catch(Exception ex) {
                return XmlElement("error",ex.Message);
            }
        }
        private XmlAttribute XmlAttribute(string attributeName, 
                                          string attributeValue){
            XmlAttribute xmlAttrib = 
                xmlDoc.CreateAttribute(attributeName);
            xmlAttrib.Value = FilterXMLString(attributeValue);
            return xmlAttrib;
        }
        private XmlElement XmlElement(string elementName, 
                                       string elementValue){
            XmlElement xmlElement = xmlDoc.CreateElement(elementName);
            xmlElement.Attributes.Append(XmlAttribute("name", 
                                      FilterXMLString(elementValue)));
            return xmlElement;
        }
        private string FilterXMLString(string inputString){
            string returnString = inputString;
            if (inputString.IndexOf("&") > 0){
                returnString = inputString.Replace("&","&");
            }
            if (inputString.IndexOf("'") > 0){
                returnString = inputString.Replace("'","'");
            }
            return returnString;
        }    
    }
}

Points of interest

The only minor point of interest is that there are 2 characters that are allowable in file names but not in XML documents. In fact there are 5 characters that are not allowed in XML documents. They are :

< < less than
> > greater than
& & ampersand
&apos; ' apostrophe
" " quotation mark

Fortunately for us, Windows takes care of 3 of them. However the ampersand and the apostrophe which are legal to use in file names will have to be handled manually. The FilterXMLString method takes care of the details.

History

  • Sept 18 2003 - Initial version (1.0.0)

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Erhan Hosca


Member

Occupation: Web Developer
Location: United States United States

Other popular Files and Folders articles:

Article Top
You must Sign In to use this message board.
FAQ FAQ 
 
Noise Tolerance  Layout  Per page   
 Msgs 1 to 9 of 9 (Total in Forum: 9) (Refresh)FirstPrevNext
GeneralMy vote of 1 Pinmembermovhlps6:20 29 Nov '08  
QuestionEditing XML file PinmemberKrishnakumar Bhagwat22:17 21 Aug '06  
Answerapp PinmemberMember 45204222:27 6 Dec '09  
GeneralSmall bug in FilterXMLString PinmemberRichard Poole7:15 12 May '04  
GeneralRe: Small bug in FilterXMLString PinmemberErhan Hosca8:15 12 May '04  
GeneralRe: Small bug in FilterXMLString Pinmemberdjarn23:34 29 Oct '04  
the FilterXMLString method is not really needed as the Value setter in XmlAttribute seems to do the job itself.
GeneralHandling Ampersands PinmemberDonald Xie16:11 11 Jan '04  
GeneralRe: Handling Ampersands PinmemberErhan Hosca4:29 12 Jan '04  
GeneralVery cool - I want more! PinsussShem Stimpy4:32 25 Sep '03  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+PgUp/PgDown to switch pages.

PermaLink | Privacy | Terms of Use
Last Updated: 17 Sep 2003
Editor: Smitha Vijayan
Copyright 2003 by Erhan Hosca
Everything else Copyright © CodeProject, 1999-2010
Web17 | Advertise on the Code Project