示例#1
0
        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);
        }
示例#2
0
        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);
        }