我有一个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;
答案 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);
}
}