private static void AddFoldersToDirectory(Folder rootFolder, IEnumerable<string> folders)
        {
            List<Folder> allFoldersInTheRootFolder = new List<Folder>();
            foreach (var folder in folders)
            {
                Folder currentFolder = new Folder(folder.ToString());
                allFoldersInTheRootFolder.Add(currentFolder);
            }

            rootFolder.ChildFolders = allFoldersInTheRootFolder;
        }
 static void Main()
 {
     // Test it with simple directory, because testing with the Windows directory is very slow
     string directory = @"E:\My Space\MySpace\Movies";
     Folder rootFolder = new Folder(directory);
     MakeTree(rootFolder);
     //PrintTree(rootFolder, ""); // Uncomment to view the result on the console!
     
     var sum = CalculateSumOfSubTreeElementsSizes(rootFolder, 1, 0);
     Console.WriteLine("The sum of the subtree is: {0}", sum);
 }
        public static void PrintTree(Folder root, string spaces)
        {
            Console.WriteLine(spaces + root.FolderName);
            foreach (var folder in root.ChildFolders)
            {
                PrintTree(folder, spaces + " ");
            }

            foreach (var file in root.Files)
            {
                Console.WriteLine(spaces + " " + file.FileName + " " + file.FileSize);
            }
        }
        private static void MakeTree(Folder root)
        {
            IEnumerable<string> folders = Directory.EnumerateDirectories(root.FolderName);
            IEnumerable<string> files = Directory.GetFiles(root.FolderName);

            AddFilesToDiretory(root, files);
            AddFoldersToDirectory(root, folders);

            for (int i = 0; i < root.ChildFolders.Count; i++)
            {
                try
                {
                    Folder currentChildFolder = root.ChildFolders[i];
                    MakeTree(currentChildFolder);
                }
                catch (UnauthorizedAccessException)
                {
                    continue;
                }
            }
        }
        private static long CalculateSumOfSubTreeElementsSizes(Folder rootFolder, int depth, long sum)
        {
            foreach (var file in rootFolder.Files)
            {
                sum += file.FileSize;
            }

            if (depth == 0)
            {
                return sum;
            }
            else
            {
                if (rootFolder.ChildFolders.Count > 0)
                {
                    foreach (var folder in rootFolder.ChildFolders)
                    {
                        sum += CalculateSumOfSubTreeElementsSizes(folder, depth - 1, sum);
                    }
                }

                return sum;
            }
        }
        private static void AddFilesToDiretory(Folder rootFolder, IEnumerable<string> files)
        {
            List<File> allFilesInTheRootFolder = new List<File>();

            foreach (var file in files)
            {
                FileInfo currentFileInfo = new FileInfo(file);
                long currentFileSize = currentFileInfo.Length;

                File currentFile = new File(file.ToString(), currentFileSize);
                allFilesInTheRootFolder.Add(currentFile);
            }

            rootFolder.Files = allFilesInTheRootFolder;
        }