【发布时间】:2018-12-10 19:55:42
【问题描述】:
我有一个将用户设置存储在标准 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“配置”不包含“文件路径”的定义,并且找不到接受“配置”类型的第一个参数的扩展方法“文件路径”(您是否缺少 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;
【问题讨论】:
-
不要使用EnvDTE,你不想写VS扩展。以及错误的配置类型。我们看不到您的第一个错误,没有必要保密。
-
根据评论更新问题
标签: c# user.config