Search code examples
c#.netfilesystemsperformance-testing

Restoring file system hierarchy from file


I'm creating File Management application (in .NET) which can copy, move and delete files and directories. I want to write performance tests for it. In order to do that I need to recreate directories and files hierarchy before each test. I would like to store this hierarchy in a file, so I can keep it in repository. I don't care about content of the files as long as I can defined file size, date modified etc.

And now my question. Is there any application/framework that can help me with that? It would be awesome if it has GUI to define hierarchy (like Windows explorer), because working with text files which contain thousands of records is painful.


Solution

  • Here is a program that stores the filesystem in an xml format :

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml;
    using System.Xml.Linq;
    using System.IO;
    
    namespace SAveDirectoriesXml
    {
        class Program
        {
            const string FILENAME = @"c:\temp\test.xml";
            const string FOLDER = @"c:\temp";
            static XmlWriter writer = null;
            static void Main(string[] args)
            {
                XmlWriterSettings settings = new XmlWriterSettings();
                settings.Indent = true;
    
                writer = XmlWriter.Create(FILENAME, settings);
                writer.WriteStartDocument(true);
    
                DirectoryInfo info = new DirectoryInfo(FOLDER);
                WriteTree(info);
    
                writer.WriteEndDocument();
                writer.Flush();
                writer.Close();
                Console.WriteLine("Enter Return");
                Console.ReadLine();
    
            }
            static long WriteTree(DirectoryInfo info)
            {
                long size = 0;
                writer.WriteStartElement("Folder");
                try
                {
                    writer.WriteAttributeString("name", info.Name);
                    writer.WriteAttributeString("numberSubFolders", info.GetDirectories().Count().ToString());
                    writer.WriteAttributeString("numberFiles", info.GetFiles().Count().ToString());
                    writer.WriteAttributeString("date", info.LastWriteTime.ToString());
    
    
                    foreach (DirectoryInfo childInfo in info.GetDirectories())
                    {
                        size += WriteTree(childInfo);
                    }
    
                }
                catch (Exception ex)
                {
                    string errorMsg = string.Format("Exception Folder : {0}, Error : {1}", info.FullName, ex.Message);
                    Console.WriteLine(errorMsg);
                    writer.WriteElementString("Error", errorMsg);
                }
    
                FileInfo[] fileInfo = null;
                try
                {
                    fileInfo = info.GetFiles();
                }
                catch (Exception ex)
                {
                    string errorMsg = string.Format("Exception FileInfo : {0}, Error : {1}", info.FullName, ex.Message);
                    Console.WriteLine(errorMsg);
                    writer.WriteElementString("Error",errorMsg);
                }
    
                if (fileInfo != null)
                {
                    foreach (FileInfo finfo in fileInfo)
                    {
                        try
                        {
                            writer.WriteStartElement("File");
                            writer.WriteAttributeString("name", finfo.Name);
                            writer.WriteAttributeString("size", finfo.Length.ToString());
                            writer.WriteAttributeString("date", info.LastWriteTime.ToString());
                            writer.WriteEndElement();
                            size += finfo.Length;
                        }
                        catch (Exception ex)
                        {
                            string errorMsg = string.Format("Exception File : {0}, Error : {1}", finfo.FullName, ex.Message);
                            Console.WriteLine(errorMsg);
                            writer.WriteElementString("Error", errorMsg);
                        }
                    }
                }
    
                writer.WriteElementString("size", size.ToString());
                writer.WriteEndElement();
                return size;
    
            }
        }
    }