1

我的 C# 应用程序有两个版本的安装程序。说V1和V2。

我已经安装了 V1。在安装项目的注册表设置中,我创建了一个注册表项InstallDir= [TARGETDIR],它提供了我的应用程序的安装文件夹。因此,当我想获取安装文件夹时,我可以使用我生成的注册表项来获取路径。

问题是在安装版本 2 V2 的过程中,我之前版本安装文件夹中的 example.txt 文件应该被复制到某个地方。

我在安装状态下的安装程序类中创建了自定义操作,如下所示。

   public override void Install(IDictionary stateSaver)
    {
        base.Install(stateSaver);
        string path = null;
        string registry_key = @"SOFTWARE\";
        using (Microsoft.Win32.RegistryKey key = Registry.LocalMachine.OpenSubKey(registry_key))
        {
            foreach (string subkey_name in key.GetSubKeyNames())
            {
                if (subkey_name == "default Company Name")
                {
                    using (RegistryKey subkey = key.OpenSubKey(subkey_name))
                    {
                        path = (string)subkey.GetValue("InstallDir");

                    }
                }
            }
        }
        string fileName = "example.txt";
        string sourcePath = path;
        string targetPath = @"C:\Users\UserName\Desktop";

        // Use Path class to manipulate file and directory paths. 
        string sourceFile = System.IO.Path.Combine(sourcePath, fileName);
        string destFile = System.IO.Path.Combine(targetPath, fileName);

        // To copy a folder's contents to a new location: 
        // Create a new target folder, if necessary. 
        if (!System.IO.Directory.Exists(targetPath))
        {
            System.IO.Directory.CreateDirectory(targetPath);
        }

        // To copy a file to another location and  
        // overwrite the destination file if it already exists.
        System.IO.File.Copy(sourceFile, destFile, true);


    }

我的想法是,如果我在自定义操作的安装方法中指定注册表的路径,它将采用以前的版本路径并将文件复制到以前的版本安装路径中。

但是,即使我复制了自定义操作的安装方法,注册表也已使用较新版本的路径进行更新,并采用当前值并使用较新版本文件进行更新。

但我需要该安装文件夹中的先前版本文件。

我怎么能做到这一点?

4

2 回答 2

1

我建议你遵循这种方法,

所以你的问题是你的 Sqllite 文件应该在安装文件夹中,当你安装新的 MSI 版本时,它会卸载现有的应用程序,它实际上会删除包括 Sqllite 在内的所有文件,

您可以通过创建一个console application. 将 sqllit 文件添加到控制台应用程序,当执行控制台 exe 时,它​​应该将 sqllite 文件复制到当前执行的文件夹中

AppDomain.CurrentDomain.BaseDirectory;

将此控制台 exe 添加到您的 MSI 项目,并在安装程序类中使用Process.Start(). 由于此 sqllite 文件是由不同的 exe 应用程序复制的,并且由于在卸载 MSI 时此 sqllite 文件不是 MSI 项目的一部分,因此它将在文件夹中保留 sqllite 文件而不删除。

希望这能解决您的问题。

于 2013-10-01T13:32:36.810 回答
0

经过一番研究,我找到了一种方法,可以在安装较新版本时从以前的安装中提取单个文件。

正如@AccessDenied 所说,添加一个单独的控制台应用程序来复制文件。

在安装程序的注册表选项中的 HKEY_LOCAL_MACHINE\Software 中添加一个注册表项 [ProductCode],其中的子项installdir具有值[TARGETDIR].

拥有旧版本的产品代码并将其存储在某个地方,例如配置文件。

在安装程序类中应处理两种情况。检查注册表以检查应用程序是否已安装。

情况1:

如果尚未安装,请运行控制台应用程序将其复制到当前安装文件夹。

或案例 2:

ProductCode在注册表键安装结构下搜索以前版本的。

(如果你想频繁更新文件,说如果它是一个SQLite文件,那么在项目中有一个单独的类来更新文件)

找到它后,提取子键值installdir和可以分配给路径的值。然后使用该路径复制所需的文件并存储它。

进阶:

以前的版本可以卸载。

单一安装。

从以前的安装中复制所需的文件

编辑:一个简单的解决方案

在自定义操作安装方法中,复制当前安装文件夹中需要的文件以备将来使用,并将其放在同一安装文件夹的某个文件夹中。

    public override void Install(IDictionary stateSaver)
    {
        base.Install(stateSaver);




        string path = null;
        string registry_key = @"SOFTWARE\";
// In my case I am getting the user selected current installation folder from the registry       
  using (Microsoft.Win32.RegistryKey key = Registry.LocalMachine.OpenSubKey(registry_key))
        {
            foreach (string subkey_name in key.GetSubKeyNames())
            {
                if (subkey_name == "Default Company Name")
                {
                    using (RegistryKey subkey = key.OpenSubKey(subkey_name))
                    {
                        path = (string)subkey.GetValue("InstallDir");

                    }
                }
            }
        }

        string fileName = "example.txt";
        string sourcePath = path;
        //Have created a folder named "tmp" in current innstallation folder.       
        string targetPath =System.IO.Path.Combine(path,"tmp");

        // Use Path class to manipulate file and directory paths. 
        string sourceFile = System.IO.Path.Combine(sourcePath, fileName);
        string destFile = System.IO.Path.Combine(targetPath, fileName);

        // To copy a folder's contents to a new location: 
        // Create a new target folder, if necessary. 
        if (!System.IO.Directory.Exists(targetPath))
        {
            System.IO.Directory.CreateDirectory(targetPath);
        }
        //Copy the required file.
        System.IO.File.Copy(sourceFile, destFile, true); 
  }

现在即使我们卸载 tmp 文件夹也不会被删除。在安装另一个版本时,我们可以从 tmp 文件夹访问以前的版本文件。

谢谢。

于 2013-10-01T15:35:45.653 回答