コード例 #1
0
        public bool Install(string destination_folder, PackageInstallerBase SelectedInstaller)
        {
            m_destination_folder = destination_folder;
            Engine.InstallerEngine.ReportProgress(LogLevel.Info, "Installing package contents to: " + destination_folder);
            m_files_unzipped = 0;
            var installedFiles = new List <string>();

            bool installSucceeded = true;

            using (ZipFile f = OpenZipFile(m_package_path))
            {
                ZipEntry packageEntry = null;
                foreach (ZipEntry entry in f)
                {
                    if (0 == string.Compare("package.xml", entry.Name, true))
                    {
                        packageEntry = entry;
                        continue;
                    }

                    entry.Flags = (int)GeneralBitFlags.UnicodeText;
                    string msg             = "";
                    string destFile        = Path.Combine(destination_folder, entry.Name);
                    int    percentComplete = (int)(100 * (double)m_files_unzipped++ / (double)Files.Count);
                    installedFiles.Add(entry.Name);
                    if (File.Exists(destFile))
                    {
                        if (!SelectedInstaller.ShouldReplaceFile(destFile))
                        {
                            msg = string.Format("  keeping local file '{0}'", destFile);
                            continue;
                        }
                    }
                    msg = string.Format("  installing '{0}'", destFile);
                    if (entry.IsFile)
                    {
                        if (!ExtractFile(f, entry, destFile))
                        {
                            installSucceeded = false;
                        }
                    }
                    Engine.InstallerEngine.ReportProgress(LogLevel.Debug, msg, percentComplete);
                }

                // Install package.xml
                if (packageEntry != null && installSucceeded)
                {
                    string packageXmlPath = Path.Combine(destination_folder, packageEntry.Name);
                    if (!ExtractFile(f, packageEntry, packageXmlPath))
                    {
                        installSucceeded = false;
                    }

                    // Add installed files to package.xml for future removal.
                    var doc = new XmlDocument();
                    doc.Load(packageXmlPath);
                    var installDirElement = doc.CreateElement("InstallFolder");
                    installDirElement.InnerText = destination_folder;
                    doc.DocumentElement.AppendChild(installDirElement);
                    var installedFilesElement = doc.CreateElement("InstalledFiles");
                    if (doc.DocumentElement != null)
                    {
                        doc.DocumentElement.AppendChild(installedFilesElement);
                        foreach (var file in installedFiles)
                        {
                            var fileElement = doc.CreateElement("File");
                            fileElement.InnerText = file.Replace("/", "\\");
                            installedFilesElement.AppendChild(fileElement);
                        }
                    }
                    doc.Save(packageXmlPath);
                }

                f.Close();
            }

            // If install failed, try to rollback from the backup files.
            if (installSucceeded)
            {
                DeleteBackupFiles();
            }
            else
            {
                Logger.Log(LogLevel.Info, "Installation failed; restoring backup files");
                RestoreBackupFiles();
            }

            return(installSucceeded);
        }
コード例 #2
0
ファイル: Package.cs プロジェクト: Crae/rhiexec
        public bool Install(string destination_folder, PackageInstallerBase SelectedInstaller)
        {
            m_destination_folder = destination_folder;
              Engine.InstallerEngine.ReportProgress(LogLevel.Info, "Installing package contents to: " + destination_folder);
              m_files_unzipped = 0;
              var installedFiles = new List<string>();

              bool installSucceeded = true;
              using (ZipFile f = OpenZipFile(m_package_path))
              {
            ZipEntry packageEntry = null;
            foreach (ZipEntry entry in f)
            {
              if (0 == string.Compare("package.xml", entry.Name, true))
              {
            packageEntry = entry;
            continue;
              }

              entry.Flags = (int)GeneralBitFlags.UnicodeText;
              string msg = "";
              string destFile = Path.Combine(destination_folder, entry.Name);
              int percentComplete = (int)(100 * (double)m_files_unzipped++ / (double)Files.Count);
              installedFiles.Add(entry.Name);
              if (File.Exists(destFile))
              {
            if (!SelectedInstaller.ShouldReplaceFile(destFile))
            {
              msg = string.Format("  keeping local file '{0}'", destFile);
              continue;
            }
              }
              msg = string.Format("  installing '{0}'", destFile);
              if (entry.IsFile)
            if (!ExtractFile(f, entry, destFile))
              installSucceeded = false;
              Engine.InstallerEngine.ReportProgress(LogLevel.Debug, msg, percentComplete);
            }

            // Install package.xml
            if (packageEntry != null && installSucceeded )
            {
              string packageXmlPath = Path.Combine(destination_folder, packageEntry.Name);
              if (!ExtractFile(f, packageEntry, packageXmlPath))
            installSucceeded = false;

              // Add installed files to package.xml for future removal.
              var doc = new XmlDocument();
              doc.Load(packageXmlPath);
              var installDirElement = doc.CreateElement("InstallFolder");
              installDirElement.InnerText = destination_folder;
              doc.DocumentElement.AppendChild(installDirElement);
              var installedFilesElement = doc.CreateElement("InstalledFiles");
              if (doc.DocumentElement != null)
              {
            doc.DocumentElement.AppendChild(installedFilesElement);
            foreach (var file in installedFiles)
            {
              var fileElement = doc.CreateElement("File");
              fileElement.InnerText = file.Replace("/", "\\");
              installedFilesElement.AppendChild(fileElement);
            }
              }
              doc.Save(packageXmlPath);
            }

            f.Close();
              }

              // If install failed, try to rollback from the backup files.
              if (installSucceeded)
              {
            DeleteBackupFiles();
              }
              else
              {
            Logger.Log(LogLevel.Info, "Installation failed; restoring backup files");
            RestoreBackupFiles();
              }

              return installSucceeded;
        }