Skip to content

Instantly share code, notes, and snippets.

@julesx
Created September 30, 2016 14:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save julesx/b81edbe007676ddc06d42d0e9837da7e to your computer and use it in GitHub Desktop.
Save julesx/b81edbe007676ddc06d42d0e9837da7e to your computer and use it in GitHub Desktop.
private readonly List<FolderVm> _folders = new List<FolderVm>();
public void UpdateFolders(string path)
{
var directoryInfo = new DirectoryInfo(Path.GetDirectoryName(path));
var iteratedDirectories = new Stack<DirectoryInfo>();
iteratedDirectories.Push(directoryInfo);
while (directoryInfo != null)
{
directoryInfo = Directory.GetParent(directoryInfo.FullName);
if (directoryInfo != null)
iteratedDirectories.Push(directoryInfo);
}
while (iteratedDirectories.Any())
{
var iteratedDirectory = iteratedDirectories.Pop();
var parentDirectory = Directory.GetParent(iteratedDirectory.FullName);
if (parentDirectory == null && _folders.All(x => x.Path != iteratedDirectory.FullName))
{
_folders.Add(new FolderVm(iteratedDirectory.FullName));
}
else if (parentDirectory != null)
{
var parentDirectoryVm = GetParentDirectoryVm(_folders, parentDirectory.FullName);
if (parentDirectoryVm.Folders.All(x => x.Path != iteratedDirectory.FullName))
{
parentDirectoryVm.Folders.Add(new FolderVm(iteratedDirectory.FullName));
}
}
}
}
private FolderVm GetParentDirectoryVm(IReadOnlyCollection<FolderVm> directories, string path)
{
var parentDirectoryVm = directories.SingleOrDefault(x => x.Path == path);
if (parentDirectoryVm != null)
return parentDirectoryVm;
foreach (var directory in directories)
{
parentDirectoryVm = GetParentDirectoryVm(directory.Folders, path);
if (parentDirectoryVm != null)
break;
}
return parentDirectoryVm;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment