升级C#

时间:2018-07-02 14:41:12

标签: c# user.config

我有一个C#应用程序,将用户设置存储在标准的user.config文件中。

这显然位于名为应用程序版本号的目录中,即

My_App / 1.0.0.0 / user.config

已成功升级到我的应用程序的新版本(1.0.0.1),将v1.0.0.0中的设置复制并保存到新版本1.0.0.1。那是容易的部分。

现在,我想在升级后删除此以前的版本目录1.0.0.0。

我意识到目录的路径不能硬编码,因为位置随环境而变化。

我一直在使用:

using System.Configuration;
...
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
        MessageBox.Show("Local user config path: {0}", config.FilePath);

直接抛出一个错误,我需要添加:

using EnvDTE;

现在我有错误:

CS0117'ConfigurationManager'不包含'OpenExeConfiguration'的定义

CS0103当前上下文中不存在名称'ConfigurationUserLevel'

CS1061'配置'不包含'FilePath'的定义,并且找不到扩展方法'FilePath'接受类型为'Configuration'的第一个参数(您是否缺少using指令或程序集引用?)

有没有办法解决这个问题?

否则,每次更新时都会创建一个新目录,尽管每个目录只有1kb,但让它们全部挂载似乎很可笑。

此外,我的应用程序未安装在用户系统上,它们都直接从分布式.exe运行


更新1


使用EnvDTE增加错误;已根据评论删除。

CS0246找不到类型或名称空间名称“配置”(您是否缺少using指令或程序集引用?)

CS0103当前上下文中不存在名称'ConfigurationManager'

CS0103当前上下文中不存在名称'ConfigurationUserLevel'


更新2


我以为我可以通过以下方式到达某个地方

string path = Application.LocalUserAppDataPath;
        MessageBox.Show(path);

相反,但这只会在原件旁边创建一个新路径,并带有以下形式的空<Program Version>目录:

<Company Name>/<Program Name>/<Program Version>

在实际的user.config路径中,<Program Name>上添加了一个哈希字符串,以形成类似于以下内容的东西:

<Program Name.exe_Url_aqod5o1hapcyjk3ku1gpyynhem0mefle>

我认为此哈希不是常数,并且在机器和安装之间会有所不同


更新3


最后,我已经能够像这样检索到user,config文件的确切路径:

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
       MessageBox.Show(config.FilePath);

using System.Configuration无法正常工作,并且我没有意识到它在代码中以较暗的颜色显示,因为未对其进行引用,因此我通过右键单击以下解决方案将其添加为参考资源管理器。

现在config包含user.config文件的完整路径,就像我在运行Windows 10的情况下一样:

<DRIVE LETTER>\Users\<USER NAME>\AppData\Local\<Company Name>\<Program Name>\<Program Version>\user.config

我需要操纵config字符串,然后从<Program Version>目录爬升到<Program Name>目录,以检查是否有除当前目录之外的其他目录<Program Version>目录,如果有,则需要删除它们。


更新4


好的,现在真的到某个地方了。我已经操纵了filePath字符串,使其处于<Program Version>父级的级别,并使用以下代码:

string FullfilePath = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal).FilePath;
        string ProgNamefilePath = Path.GetFullPath(Path.Combine(FullfilePath, @"..\..\"));
        Directory.Delete(ProgNamefilePath, true);
        //MessageBox.Show(ProgNamefilePath);//For Testing Purposes

我可以删除此目录下的所有目录。

不,我被困住了,因为我不想删除与<Program Version>有关的所有目录,而只删除与当前版本不匹配的目录。

Application.ProductVersion;

2 个答案:

答案 0 :(得分:0)

一个不眠之夜思考这个问题并尝试考虑其他途径,我终于想到了这一点,并且有效。

也许有更整齐的方法可以做到这一点,但是无论如何...

在我可能放置的代码中尽可能高的位置,以便希望在编码升级时对我自己非常明显,我放置了此代码:

public class MainForm : Form
  {
//***********************************
//***********************************
//**** THIS RELEASE IS v1.0.0.1 ****
//***********************************
//****** REMEMBER TO EDIT THIS ******
//***********************************
const string DeleteThisVersionDirectory = "1.0.0.0"; //**** Set this to the <Program Version> Directory to be Deleted on Upgrade, usually version prior to new release. ****
//***********************************
//***********************************

您可以看到它位于Form开口的正下方,以便查看。

然后我创建了这个方法:

private void ApplicationUpdate()
    {
        string FullfilePath = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal).FilePath;
        string VersionDirectoryfilePath = Path.GetFullPath(Path.Combine(FullfilePath, @"..\..\" + DeleteThisVersionDirectory));
        if (Properties.Settings.Default.UpdateSettings)
        {
            Properties.Settings.Default.Upgrade();
            Properties.Settings.Default.UpdateSettings = false;
            Properties.Settings.Default.Save();
            Directory.Delete(VersionDirectoryfilePath, true);
        }
    }

此方法在这里称为:

public MainForm()
    {
        InitializeComponent();
        ApplicationUpdate();
        GetSettingsValues();
    }

所有操作均正常运行,因此在成功将用户设置转移到新程序版本的Upgrade的{​​{1}}后,将删除先前的程序版本目录和user.config文件。

我只需要记住在每个版本更新代码上更改user.config

答案 1 :(得分:0)

这就是我的方法。升级后,我删除了除实际文件夹之外的所有user.config文件夹。因此,我不需要在顶部手动添加当前版本。希望能有所帮助。我知道该职位的年龄稍大一些,但可能会对某人有所帮助。在我的应用程序中,我分三部分执行此操作,以使其正常工作。

a)UI上的全局变量

bool DeleteOldDirectories = false;

b)在我的Main()中,在升级UI之前,我先将属性升级并将其保存在新版本中

if (Settings.Default.UpgradeRequired)
            {
                Settings.Default.Upgrade();
                Settings.Default.UpgradeRequired = false;
                Settings.Default.Save();
                DeleteOldDirectories = true;
            }

在Window.Loaded方法中,在加载UI并确定所有属性都正确更新后,我确实删除了旧目录,因此从现在起所有更改都以我的最新版本和所有对old的引用进行保存版本不见了。

 if (deleteOldDirectories)
        {
            string FullfilePath = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal).FilePath;
            string VersionDirectoryfilePath = System.IO.Path.GetFullPath(System.IO.Path.Combine(FullfilePath, @"..\..\"));
            string[] fileEntries = Directory.GetDirectories(VersionDirectoryfilePath);
            foreach (string filename in fileEntries)
            {
             //   MessageBox.Show(filename);
                if (filename != VersionDirectoryfilePath + System.Reflection.Assembly.GetEntryAssembly().GetName().Version.ToString())
                    Directory.Delete(filename, true);
            }
        }