static string GetFullPath(MsiDatabase db, string dirId, string pathSoFar) { var dir = db.Directories.Where(d => d.Directory == dirId).First(); var parent = db.Directories.Where(d => d.Directory == dir.DirectoryParent).FirstOrDefault(); var dirName = dir.DefaultDir == "." ? $"[{dir.Directory}]" : dir.DefaultDir.Split('|').Last(); return(parent != null ? GetFullPath(db, dir.DirectoryParent, $"{dirName}\\{pathSoFar}") : $"{dirName}\\{pathSoFar}"); }
static MsiDatabase Parse(string path) { using (var database = new Database(path, DatabaseOpenMode.ReadOnly)) { var db = new MsiDatabase(); db.Files = ViewToIEnumerable(database, "SELECT * FROM File", (file) => new MsiFile { File = file.GetString(1), Component = file.GetString(2), FileName = file.GetString(3), FileSize = file.GetString(4), Version = file.GetString(5), Language = file.GetString(6), Atttibutes = file.GetString(7), Sequence = file.GetString(8) }); db.Directories = ViewToIEnumerable(database, "SELECT * FROM Directory", (dir) => new MsiDirectory { Directory = dir.GetString(1), DirectoryParent = dir.GetString(2), DefaultDir = dir.GetString(3) }); db.Components = ViewToIEnumerable(database, "SELECT * FROM Component", (comp) => new MsiComponent { Component = comp.GetString(1), ComponentId = comp.GetString(2), Directory = comp.GetString(3), Condition = comp.GetString(4), KeyPath = comp.GetString(5), Attributes = comp.GetString(6) }); db.Registries = ViewToIEnumerable(database, "SELECT * FROM Registry", (reg) => new MsiRegistry { Registry = reg.GetString(1), Root = reg.GetString(2), Key = reg.GetString(3), Name = reg.GetString(4), Value = reg.GetString(5), Component = reg.GetString(6) }); return(db); } }