0


0

ユーザーごとの設定を含むWindowsフォームアプリケーションがあります。 私はProperties.Settings.Default.Upgrade()を使用してバージョン間でこれらの設定を保存していますが、すべて問題ありません。 最近私は自分のアプリケーションのexeファイル名を変更しなければならなかったので、アップグレードの後、すべての設定はデフォルト値に戻ります。

設定システムは別のアプリケーションだと思うので、私の質問は、別のアプリケーション(古いもの)の設定を取得する方法があるのでしょうか。

System.ConfigurationManagerには、現在のアプリケーション以外の設定ファイルを開くためのいくつかの方法(すなわち、System.Configuration.ConfigurationManager.OpenMappedExeConfiguration)がありますが、それらはすべて特定の設定ファイルを開くようです。

ユーザーごとの設定を読みたいのですが、これらはLocalSettingsフォルダー内のわかりにくい場所に埋め込まれているため、これらのメソッドに何を渡すべきかわかりません。

1 回答


0


完全を期して 私はこのハックで終わった。 醜い、しかしそれはうまくいく。

メイン方式で (string.IsNullOrEmpty(Properties.Settings.Default.Categories))\ {UpgradeAppSettings(); }

同じクラスのこれらのメソッドで。

private static void UpgradeAppSettings(){try //失敗して失敗する! このハックは問題を引き起こすほど重要ではありません。{List paths = new List();} paths.Add(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)); paths.Add(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData));

foreach(パス内の文字列パス){st​​ring companypath = System.IO.Directory.GetDirectories(path、 "COMPANYNAME")。FirstOrDefault(); if(companypath!= null){文字列appfolder = System.IO.Directory.GetDirectories(companypath、 "OldName.exe _ *")。FirstOrDefault();

if(appfolder!= null){// user.configファイルを含むアプリケーションの最新バージョンを取得するvar version = System.IO.Directory.GetDirectories(appfolder).Select(d => new {Path = d、Version = CreateVersion(新しいSystem.IO.DirectoryInfo(d).Name)、ConfigFile = System.IO.Directory.GetFiles(d、 "user.config")。FirstOrDefault()}).Where(v => v.Version!) = null

//直列化されたカテゴリの名前空間を変更するtext = text.Replace( "http://schemas.microsoft.com/clr/nsassem/OldName/OldName"、 "http://schemas.microsoft.com/clr/nsassem/OldName /新しい名前");

var doc = XDocument.Parse(text); var settings = doc.Descendants( "setting");

//これらはApplySettingに関係のある設定です(settings、 "Categories"、s => Properties.Settings.Default.Categories = s); ApplySetting(settings、 "ActiveCategoryFilter"、s => Properties.Settings.Default.ActiveCategoryFilter = s); ApplySetting(settings、 "ActiveCategoryFilterDisplayName"、s => Properties.Settings.Default.ActiveCategoryFilterDisplayName = s); ApplySetting(settings、 "ListViewLayout"、s => Properties.Settings.Default.ListViewLayout = s); ApplySetting(settings、 "SplitterSizes"、s => Properties.Settings.Default.SplitterSizes = s); ApplySetting(settings、 "EditorSizes"、s => Properties.Settings.Default.EditorSizes = s); ApplySetting(settings、 "WindowStates"、s => Properties.Settings.Default.WindowStates = s); ApplySetting(settings、 "WindowStates"、s => Properties.Settings.Default.WindowStates = s);ブレーク;キャッチ{}}

プライベート静的無効ApplySetting(IEnumerable設定、文字列名、アクション){var cat = settings.FirstOrDefault(s => s.Attribute( "name")!= null