Удалить предыдущую версию файла настроек пользователя и каталог конфигурации после обновления C # - PullRequest
0 голосов
/ 02 июля 2018

У меня есть приложение 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;

1 Ответ

0 голосов
/ 03 июля 2018

Бессонная ночь, думая об этом и пытаясь обдумать другие пути, я наконец-то придумал это, и это работает.

Возможно, есть более изящные способы сделать это, но в любом случае ....

Так высоко в коде, что я мог бы разместить его, чтобы, надеюсь, сделать его чрезвычайно очевидным для себя при кодировании обновлений, я разместил это:

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, когда пользовательские настройки переносятся в user.config НОВОЙ версии программы, предыдущий каталог версии программы и user.config файл удаляются.

Мне просто нужно помнить, чтобы const string DeleteThisVersionDirectory изменялось в каждой версии обновления кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...