using System; using System.Collections.ObjectModel; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Caliburn.Micro.Core; namespace VirgoUI.Client.Models.Recipe { public class FileNode : PropertyChangedBase { public FileNode() { this.Files = new ObservableCollection(); this.IsFile = false; } private string name = string.Empty; public string Name { get { return name; } set { name = value; NotifyOfPropertyChange("Name"); } } public string FullPath { get; set; } public FileNode Parent { get; set; } public ObservableCollection Files { get; set; } public bool IsFile { get; set; } } public class RecipeSequenceTreeBuilder { public static List GetFiles(List filenames) { List folders = new List(); FileNode root = new FileNode() { Name = "Files", IsFile = false, FullPath="" }; folders.Add(root); foreach(string filename in filenames) { string[] filesplits = filename.Split('\\'); FileNode parent = root; if (filesplits.Length>1) { for(var index =0;index< filesplits.Length-1; index++) { bool found = false; for(var j = 0; j < parent.Files.Count; j++) { if(parent.Files[j].Name == filesplits[index] && !parent.Files[j].IsFile) { found = true; parent = parent.Files[j]; break; } } if (!found) { FileNode folder = new FileNode() { Name = filesplits[index], IsFile = false }; folder.FullPath = (parent.FullPath == string.Empty ? filesplits[index] : parent.FullPath + "\\" + filesplits[index]); folder.Parent = parent; parent.Files.Add(folder); parent = folder; } } } FileNode file = new FileNode() { Name = filesplits[filesplits.Length - 1], IsFile = true }; file.FullPath = (parent.FullPath == string.Empty ? filesplits[filesplits.Length - 1] : parent.FullPath + "\\" + filesplits[filesplits.Length - 1]); file.Parent = parent; parent.Files.Add(file); } return folders; } } }