private FolderEntry GetOrCreateParent(FolderEntry folderEntry, IDictionary <string, FolderEntry> folderEntryMap) { var parentFolder = Path.GetDirectoryName(folderEntry.FullPath); Debug.Assert(parentFolder != null); FolderEntry parentFolderEntry; if (!folderEntryMap.TryGetValue(parentFolder, out parentFolderEntry)) { parentFolderEntry = new FolderEntry { FullPath = parentFolder, Name = Path.GetFileName(parentFolder) }; folderEntryMap[parentFolder] = parentFolderEntry; if (parentFolder != Path.GetPathRoot(parentFolder)) { parentFolderEntry.Parent = this.GetOrCreateParent(parentFolderEntry, folderEntryMap); } } folderEntry.Parent = parentFolderEntry; parentFolderEntry?.Folders.Add(folderEntry); return(parentFolderEntry); }
public FolderEntry Generate(string vaultName) { var encryptedFileLocation = this.configurationProvider.Configuration.Vaults .Single(x => x.Name == vaultName).EncryptedFileLocation; var files = Directory .GetFiles(encryptedFileLocation, "*.vault", SearchOption.TopDirectoryOnly) .Select(x => new FileNameInfo { Original = string.Empty, Encrypted = x }) .ToArray(); Parallel.ForEach(files, x => x.Original = this.ExtractFileName(x.Encrypted)); var fileMap = files.ToDictionary(x => x.Original, x => x.Encrypted); var folderEntryMap = new Dictionary <string, FolderEntry>(); foreach (var file in fileMap.Keys.OrderBy(x => x)) { var folder = Path.GetDirectoryName(file); if (folder == null) { throw new Exception($"Unexpected error - cannot get directory name from file {file}."); } FolderEntry folderEntry; if (!folderEntryMap.TryGetValue(folder, out folderEntry)) { folderEntry = new FolderEntry { FullPath = folder, Name = Path.GetFileName(folder) }; if (folder != Path.GetPathRoot(folder)) { folderEntry.Parent = this.GetOrCreateParent(folderEntry, folderEntryMap); } folderEntryMap[folder] = folderEntry; } var fileEntry = new FileEntry { OriginalFullPath = file, EncryptedFullPath = fileMap[file], Name = Path.GetFileName(file), Parent = folderEntry }; folderEntry.Files.Add(fileEntry); } var root = folderEntryMap.Values.Single(x => x.FullPath == Path.GetPathRoot(x.FullPath)); root.Name = "ROOT"; return(root); }