ConfigurationManager.AppSettings - Làm thế nào để sửa đổi và lưu?


81

Nghe có vẻ quá đáng để hỏi và tôi làm điều tương tự như được đề xuất trong các bài báo, nhưng nó không hoạt động như mong đợi. Hy vọng ai đó có thể chỉ cho tôi hướng đi đúng.

Tôi muốn lưu các thiết lập người dùng cho mỗi AppSettings.

Khi Winform được đóng, tôi sẽ kích hoạt điều này:

conf.Configuration config = 
           ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

if (ConfigurationManager.AppSettings["IntegrateWithPerforce"] != null)
    ConfigurationManager.AppSettings["IntegrateWithPerforce"] = 
                                           e.Payload.IntegrateCheckBox.ToString();
else
    config.AppSettings.Settings.Add("IntegrateWithPerforce", 
                                          e.Payload.IntegrateCheckBox.ToString());

config.Save(ConfigurationSaveMode.Modified);

Vì vậy, lần đầu tiên khi mục nhập chưa tồn tại, nó sẽ chỉ cần tạo nó, nếu không nó sẽ sửa đổi mục nhập hiện có. Tuy nhiên, điều này không tiết kiệm.

1) Tôi đang làm gì sai?

2) Tôi đang mong đợi cài đặt người dùng cho cài đặt Ứng dụng được lưu lại ở đâu? Nó nằm trong thư mục Gỡ lỗi hay trong thư mục C: \ Documents and Settings \ USERNAME \ Local Settings \ Application Data?


Tham khảo điều này: stackoverflow.com/questions/453161/…
Kumar


3
Nó sẽ nằm trong thư mục chứa tệp thực thi. Vì vậy, nếu bạn chạy nó từ Visual Studio trong Gỡ lỗi, nó sẽ nằm trong thư mục Gỡ lỗi của dự án của bạn.
Justin

1
Ditto những gì Justin đã nói. Và nếu bạn đang chạy từ Visual Studio, nó sẽ GHÉP Tệp .config trong thư mục Gỡ lỗi của dự án mỗi khi bạn chạy lại ứng dụng của mình.
Welton v3.60

1
geekswithblogs.net/akraus1/archive/2006/01/04/64871.aspx hy vọng điều này sẽ giúp được :)
Thomas

Câu trả lời:


25

Có lẽ bạn nên xem xét thêm một tệp cài đặt. (ví dụ: App.Settings) Tạo tệp này sẽ cho phép bạn thực hiện những việc sau:

string mysetting = App.Default.MySetting;
App.Default.MySetting = "my new setting";

Điều này có nghĩa là bạn có thể chỉnh sửa và sau đó thay đổi các mục, trong đó các mục được nhập mạnh và tốt nhất là ... bạn không phải chạm vào bất kỳ xml nào trước khi triển khai!

Kết quả là cài đặt theo ngữ cảnh Ứng dụng hoặc Người dùng.

Xem trong menu "thêm mục mới" cho tệp cài đặt.


1
Thêm tệp Settings.Settings hoặc sử dụng tệp hiện có trong Properties / Settings.settings là điều tương tự phải không? Trong trường hợp sử dụng lối thoát, tôi sẽ làm như sau: Properties.Settings.Default.IntegrateWithPerforce = _integrateCheckBox.Checked; Properties.Settings.Default.Save ();
Houman

1
Hoàn toàn có thể. Tôi đã luôn chỉ sử dụng các tệp riêng biệt vì điều đó đã làm tốt cho tôi. Nếu đúng như vậy, tôi vừa học được một điều
Dan

Thật hấp dẫn, nếu bạn sử dụng cái này VÀ Trình quản lý cấu hình thì tất cả các cài đặt vẫn kết thúc trong tệp App.config nhưng dưới các phần khác nhau. Tôi đã mong đợi 2 tệp khác nhau.
RyanfaeScotland

Tôi không thể tin rằng tôi đã lặp lại một tệp XML suốt thời gian qua. Cảm ơn rất nhiều cho mẹo hữu ích này!
Smitty-Werben-Jager-Manjenson

78

Tôi biết mình đến muộn :) Nhưng đây là cách tôi làm:

public static void AddOrUpdateAppSettings(string key, string value)
{
    try
    {
        var configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        var settings = configFile.AppSettings.Settings;
        if (settings[key] == null)
        {
            settings.Add(key, value);
        }
        else
        {
            settings[key].Value = value;
        }
        configFile.Save(ConfigurationSaveMode.Modified);
        ConfigurationManager.RefreshSection(configFile.AppSettings.SectionInformation.Name);
    }
    catch (ConfigurationErrorsException)
    {
        Console.WriteLine("Error writing app settings");
    }
}

Để biết thêm thông tin, hãy xem MSDN


3
Một điểm chính cần lưu ý ở trên là nếu bạn đang chạy điều này từ trình gỡ lỗi (trong Visual Studio) thì tệp app.config sẽ bị ghi đè mỗi khi bạn xây dựng. Cách tốt nhất để kiểm tra điều này là xây dựng ứng dụng của bạn và sau đó điều hướng đến thư mục đầu ra và khởi chạy tệp thực thi của bạn từ đó. --- từ vbcity.com/forums/t/152772.aspx
Yu Yang Jian

69

Về cách thay đổi giá trị trong phần appSettings trong tệp app.config của bạn:

config.AppSettings.Settings.Remove(key);
config.AppSettings.Settings.Add(key, value);

Làm công việc.

Tất nhiên thực hành tốt hơn là lớp Cài đặt nhưng nó phụ thuộc vào những gì bạn đang theo đuổi.


4
Sau khi xem xét ba điều chỉnh ý tưởng AppSettings kajillion ở đây và ở nước ngoài, đây là đơn giản nhất / tốt nhất, và (điều quan trọng) hoạt động ngay cả khi người dùng phá hủy phần <appSettings> nút
downwitch

39

Thích <appSettings>để <customUserSetting>phần. Đọc VÀ ghi với (Web) ConfigurationManager dễ dàng hơn nhiều. ConfigurationSection, ConfigurationElement và ConfigurationElementCollection yêu cầu bạn dẫn xuất các lớp tùy chỉnh và triển khai các thuộc tính ConfigurationProperty tùy chỉnh. Quá nhiều cho IMO bình thường hàng ngày.

Đây là một ví dụ về cách đọc và ghi vào web.config:

using System.Web.Configuration;
using System.Configuration;

Configuration config = WebConfigurationManager.OpenWebConfiguration("/");
string oldValue = config.AppSettings.Settings["SomeKey"].Value;
config.AppSettings.Settings["SomeKey"].Value = "NewValue";
config.Save(ConfigurationSaveMode.Modified);

Trước:

<appSettings>
  <add key="SomeKey" value="oldValue" />
</appSettings>

Sau:

<appSettings>
  <add key="SomeKey" value="newValue" />
</appSettings>

23

vì câu hỏi cơ bản là về các biểu mẫu giành chiến thắng, đây là giải pháp: (Tôi vừa thay đổi mã bởi user1032413 thành cài đặt windowsForms rflect) nếu đó là khóa mới:

Configuration config = configurationManager.OpenExeConfiguration(Application.ExecutablePath); 
config.AppSettings.Settings.Add("Key","Value");
config.Save(ConfigurationSaveMode.Modified);

nếu khóa đã tồn tại:

Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath); 
config.AppSettings.Settings["Key"].Value="Value";
config.Save(ConfigurationSaveMode.Modified);

8

Hãy thử thêm cái này sau cuộc gọi lưu của bạn.

ConfigurationManager.RefreshSection( "appSettings" );

1
Điều này đặc biệt quan trọng nếu bạn đang viết sau đó đọc cho cùng một ứng dụng Thiết lập liên tục.
Trevor

6

Hãy nhớ rằng ConfigurationManager chỉ sử dụng một app.config - một ứng dụng nằm trong dự án khởi động.

Nếu bạn đặt một số app.config vào một giải pháp A và tham chiếu đến nó từ một giải pháp B khác thì nếu bạn chạy B, app.config từ A sẽ bị bỏ qua.

Vì vậy, dự án thử nghiệm đơn vị ví dụ nên có app.config của riêng họ.


2

Tôi nghĩ rằng vấn đề là trong studio trực quan gỡ lỗi không sử dụng exeName bình thường.

nó sử dụng indtead "NameApplication" .host.exe

vì vậy tên của tệp cấu hình là "NameApplication" .host.exe.config chứ không phải "NameApplication" .exe.config

và sau khi ứng dụng đóng - nó quay trở lại app.config

vì vậy nếu bạn kiểm tra tệp sai hoặc bạn kiểm tra sai thời điểm, bạn sẽ thấy không có gì thay đổi.


0

Bạn có thể thay đổi nó theo cách thủ công:

private void UpdateConfigFile(string appConfigPath, string key, string value)
{
     var appConfigContent = File.ReadAllText(appConfigPath);
     var searchedString = $"<add key=\"{key}\" value=\"";
     var index = appConfigContent.IndexOf(searchedString) + searchedString.Length;
     var currentValue = appConfigContent.Substring(index, appConfigContent.IndexOf("\"", index) - index);
     var newContent = appConfigContent.Replace($"{searchedString}{currentValue}\"", $"{searchedString}{newValue}\"");
     File.WriteAllText(appConfigPath, newContent);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.