sashomaga

Tree DFS recursion

Jun 2nd, 2013
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.58 KB | None | 0 0
  1. /* Define classes File { string name, int size } and Folder { string name, File[] files, Folder[] childFolders } and using them build a tree keeping all files and folders on the hard drive starting from C:\WINDOWS. Implement a method that calculates the sum of the file sizes in given subtree of the tree and test it accordingly. Use recursive DFS traversal. */
  2.  
  3. class File
  4. {
  5.     public File(string name, long size)
  6.     {
  7.         this.Name = name;
  8.         this.Size = size;
  9.     }
  10.  
  11.     public string Name { get; private set; }
  12.  
  13.     public long Size { get; private set; }
  14. }
  15.  
  16. class Folder
  17. {
  18.     public Folder(string name, List<File> files, List<Folder> childFolders)
  19.     {
  20.         this.Name = name;
  21.         this.Files = files;
  22.         this.ChildFolders = childFolders;
  23.     }
  24.  
  25.     public string Name { get; private set; }
  26.  
  27.     public List<File> Files { get; private set; }
  28.  
  29.     public List<Folder> ChildFolders { get; private set; }
  30.  
  31.     public override string ToString()
  32.     {
  33.         return this.Name;
  34.     }
  35. }
  36.  
  37. using System;
  38. using System.Collections.Generic;
  39. using System.IO;
  40. using System.Linq;
  41.  
  42. class Program
  43. {
  44.     static Stack<Folder> folders = new Stack<Folder>();
  45.     static long sum = 0;
  46.  
  47.     static void Main()
  48.     {
  49.         string sourceDirectory = @"C:\Windows";
  50.         string searchedDirectory = "Cursors";
  51.  
  52.         Folder result = TraverseDirectory(sourceDirectory);
  53.  
  54.         Folder searchedFolder = GetDirectory(searchedDirectory, result);
  55.  
  56.         Console.WriteLine(searchedFolder);
  57.  
  58.         long totalSize = CalculateTotalSize(searchedFolder);
  59.  
  60.         Console.WriteLine(totalSize);
  61.     }
  62.  
  63.     private static Folder TraverseDirectory(string sourceDirectory)
  64.     {
  65.         DirectoryInfo di = new DirectoryInfo(sourceDirectory);
  66.         FileInfo[] filesInfo = di.GetFiles();
  67.         DirectoryInfo[] directoriesInfo = di.GetDirectories();
  68.  
  69.         List<File> files = new List<File>();
  70.         foreach (var file in filesInfo)
  71.         {
  72.             files.Add(new File(file.Name, file.Length));
  73.         }
  74.  
  75.         List<Folder> directories = new List<Folder>();
  76.         foreach (var directory in directoriesInfo)
  77.         {
  78.             try
  79.             {
  80.                 directories.Add(TraverseDirectory(directory.FullName));
  81.             }
  82.             catch (UnauthorizedAccessException)
  83.             {
  84.                 // Skip inaccessible directories
  85.             }
  86.  
  87.         }
  88.  
  89.         string[] args = sourceDirectory.Split('\\');
  90.         string name = args[args.Length - 1];
  91.         Folder currentDirectory = new Folder(name, files, directories);
  92.  
  93.         return currentDirectory;
  94.     }
  95.  
  96.     private static long CalculateTotalSize(Folder searchedFolder)
  97.     {
  98.         foreach (File file in searchedFolder.Files)
  99.         {
  100.             sum += file.Size;
  101.         }
  102.         foreach (Folder folder in searchedFolder.ChildFolders)
  103.         {
  104.             CalculateTotalSize(folder);
  105.         }
  106.         return sum;
  107.     }
  108.  
  109.     public static Folder GetDirectory(string name, Folder tree)
  110.     {
  111.         GetFoldersStack(tree);
  112.         while (folders.Count > 0)
  113.         {
  114.             if (folders.Peek().Name == name)
  115.             {
  116.                 return folders.Pop();
  117.             }
  118.             else
  119.             {
  120.                 folders.Pop();
  121.             }
  122.         }
  123.         throw new ArgumentException("Folder not found");
  124.     }
  125.  
  126.     private static void GetFoldersStack(Folder tree)
  127.     {
  128.         foreach (Folder folder in tree.ChildFolders)
  129.         {
  130.             folders.Push(folder);
  131.             GetFoldersStack(folder);
  132.         }
  133.     }
  134.  
  135. }
Advertisement
Add Comment
Please, Sign In to add comment