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