using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections.Concurrent; using System.Xml; namespace Differ { public class FileSystem { #region .ctor #endregion #region Methods public void Parse(string rootPath) { Root = new Folder(rootPath); } public void SaveToXmlFile(string path) { XmlDocument doc = new XmlDocument(); doc.AppendChild(Root.GetXmlNode(doc)); doc.Save(path); } public void ParseFromXml(string path) { XmlDocument doc = new XmlDocument(); nodesWithParentToParse = new ConcurrentQueue>(); doc.Load(path); foreach (XmlNode node in doc) { if(node.Name == "Folder") nodesWithParentToParse.Enqueue(new KeyValuePair(node, null)); } ParseXmlNodes(); } private void ParseXmlNodes() { while (nodesWithParentToParse.Count > 0) { KeyValuePair pair; if(!nodesWithParentToParse.TryDequeue(out pair)) continue; Folder f = new Folder {Parent = pair.Value}; f.ParseFromXmlNode(pair.Key); if(pair.Value != null) pair.Value.Folders.Add(f); else this.Root = f; foreach (XmlNode n in pair.Key.ChildNodes) if (n.Name == "Folder") nodesWithParentToParse.Enqueue(new KeyValuePair(n, f)); else if (n.Name == "File") { File file = new File(); file.ParseFromXmlNode(n); file.Parent = f; f.Files.Add(file); } } } public IEnumerable GetDiffs(FileSystem target) { List diffs = new List(); ConcurrentQueue workerQueue = new ConcurrentQueue(); Folder.FolderParser parserRoot = new Folder.FolderParser(Root, target.Root, workerQueue.Enqueue); workerQueue.Enqueue(parserRoot); Folder.FolderParser result; while (workerQueue.TryDequeue(out result)) { result.Run(); diffs.AddRange(result.Diffs); } return diffs; } #endregion #region Propertys public Folder Root { get; private set; } #endregion #region Variables private ConcurrentQueue> nodesWithParentToParse; #endregion } }