我有一个将用户设置存储在标准 user.config 文件中的 C# 应用程序。
这显然位于一个名为应用程序版本号的目录中,即
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“配置”不包含“文件路径”的定义,并且找不到接受“配置”类型的第一个参数的扩展方法“文件路径”(您是否缺少使用指令或程序集引用?)
有没有解决的办法?
否则每次更新都会创建一个新目录,虽然每个目录只有 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;