Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* 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. */
- class File
- {
- public File(string name, long size)
- {
- this.Name = name;
- this.Size = size;
- }
- public string Name { get; private set; }
- public long Size { get; private set; }
- }
- class Folder
- {
- public Folder(string name, List<File> files, List<Folder> childFolders)
- {
- this.Name = name;
- this.Files = files;
- this.ChildFolders = childFolders;
- }
- public string Name { get; private set; }
- public List<File> Files { get; private set; }
- public List<Folder> ChildFolders { get; private set; }
- public override string ToString()
- {
- return this.Name;
- }
- }
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- class Program
- {
- static Stack<Folder> folders = new Stack<Folder>();
- static long sum = 0;
- static void Main()
- {
- string sourceDirectory = @"C:\Windows";
- string searchedDirectory = "Cursors";
- Folder result = TraverseDirectory(sourceDirectory);
- Folder searchedFolder = GetDirectory(searchedDirectory, result);
- Console.WriteLine(searchedFolder);
- long totalSize = CalculateTotalSize(searchedFolder);
- Console.WriteLine(totalSize);
- }
- private static Folder TraverseDirectory(string sourceDirectory)
- {
- DirectoryInfo di = new DirectoryInfo(sourceDirectory);
- FileInfo[] filesInfo = di.GetFiles();
- DirectoryInfo[] directoriesInfo = di.GetDirectories();
- List<File> files = new List<File>();
- foreach (var file in filesInfo)
- {
- files.Add(new File(file.Name, file.Length));
- }
- List<Folder> directories = new List<Folder>();
- foreach (var directory in directoriesInfo)
- {
- try
- {
- directories.Add(TraverseDirectory(directory.FullName));
- }
- catch (UnauthorizedAccessException)
- {
- // Skip inaccessible directories
- }
- }
- string[] args = sourceDirectory.Split('\\');
- string name = args[args.Length - 1];
- Folder currentDirectory = new Folder(name, files, directories);
- return currentDirectory;
- }
- private static long CalculateTotalSize(Folder searchedFolder)
- {
- foreach (File file in searchedFolder.Files)
- {
- sum += file.Size;
- }
- foreach (Folder folder in searchedFolder.ChildFolders)
- {
- CalculateTotalSize(folder);
- }
- return sum;
- }
- public static Folder GetDirectory(string name, Folder tree)
- {
- GetFoldersStack(tree);
- while (folders.Count > 0)
- {
- if (folders.Peek().Name == name)
- {
- return folders.Pop();
- }
- else
- {
- folders.Pop();
- }
- }
- throw new ArgumentException("Folder not found");
- }
- private static void GetFoldersStack(Folder tree)
- {
- foreach (Folder folder in tree.ChildFolders)
- {
- folders.Push(folder);
- GetFoldersStack(folder);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment