У меня есть приложение 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», принимающего первый аргумент типа «Конфигурация» (вам не хватает директивы using или ссылки на сборку?)
Есть ли способ обойти это?
В противном случае при каждом обновлении будет создаваться новый каталог, и хотя каждый из них занимает всего 1 КБ, кажется нелепым позволять всем им монтироваться.
Кроме того, мое приложение не установлено в пользовательской системе, оно запускается прямо из распространяемого .exe
ОБНОВЛЕНИЕ 1
Добавление ошибок с использованием EnvDTE; УДАЛЕНО согласно комментарию.
CS0246 Не удалось найти тип или имя пространства имен 'Configuration' (отсутствует директива 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>
parent и используя этот код:
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;