2012-03-05 17 views
17

Tôi đã nhận thấy trên một vài máy trong đó tệp user.config của ứng dụng của tôi bằng cách nào đó bị hỏng và trống khi mở. Tôi dường như không thể hiểu tại sao điều này lại xảy ra. Có một điều phổ biến mà có thể gây ra điều này? Bất kỳ cách nào để ngăn chặn điều này một cách an toàn?Điều gì khiến user.config bị trống? Và làm cách nào để khôi phục mà không cần khởi động lại?

Câu hỏi thứ hai của tôi là làm cách nào để tôi khôi phục trạng thái? Tôi bắt ngoại lệ và xóa tệp user.config, nhưng tôi không thể tìm cách khôi phục cấu hình mà không cần khởi động lại ứng dụng. Tất cả những gì tôi làm trên đối tượng Properties gây lỗi sau:

"hệ thống Cấu hình không thể khởi"

Reset, Nạp lại, và nâng cấp tất cả làm gì để giải quyết vấn đề.

Đây là mã của tôi để xóa sau khi ngoại lệ:

catch (System.Configuration.ConfigurationErrorsException ex) 
{ 
    string fileName = ""; 
    if (!string.IsNullOrEmpty(ex.Filename)) 
     fileName = ex.Filename; 
    else 
    { 
     System.Configuration.ConfigurationErrorsException innerException = ex.InnerException as System.Configuration.ConfigurationErrorsException; 
     if (innerException != null && !string.IsNullOrEmpty(innerException.Filename)) 
      fileName = innerException.Filename; 
    } 
    if (System.IO.File.Exists(fileName)) 
     System.IO.File.Delete(fileName); 
} 
+2

Nếu file user.config là corrrupt, bạn phải khởi động lại, miễn là bạn thực sự lưu trữ các giá trị trong hồ sơ của khung cảnh. Lý do bạn phải khởi động lại là hiển nhiên, nếu tệp bị hỏng, ứng dụng của bạn ở trạng thái không ổn định. –

+1

Đó là những gì tôi đã tìm ra. Tôi đã hy vọng có một cách để khôi phục cấu hình ứng dụng về cài đặt mặc định của nó trong thời gian chạy mà không cần phải khởi động lại - khi khởi động lại dường như rất không đáng tin cậy. – JeremyK

+1

Tôi có một ứng dụng biểu diễn cùng một vấn đề này theo thời gian. Cho đến nay, tôi đã không tìm thấy một giải pháp cho, hoặc nguyên nhân gốc rễ của, vấn đề này. Ứng dụng đã chuyển từ .NET v3.5 sang phiên bản v4.0, do đó vấn đề có trong cả thời gian chạy v2.0 và v4.0. Có thể trùng lặp: http://stackoverflow.com/questions/3071651/how-to-catch-exception-when-loading-net-winform-app-user-config-file – harlam357

Trả lời

13

Chúng tôi đã có vấn đề này trong ứng dụng của chúng tôi - và tôi đã không thể tìm hiểu TẠI SAO (tôi đoán là tôi đang viết để Properties.Settings quá thường xuyên nhưng tôi không chắc chắn). Dù sao, cách giải quyết của tôi là dưới đây. Điều quan trọng là để xóa tập tin bị hỏng và gọi Properties.Settings.Default.Upgrade()

try 
{ 
    ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal); 
} 
catch (ConfigurationErrorsException ex) 
{ 
    string filename = ex.Filename; 
    _logger.Error(ex, "Cannot open config file"); 

    if (File.Exists(filename) == true) 
    { 
     _logger.Error("Config file {0} content:\n{1}", filename, File.ReadAllText(filename)); 
     File.Delete(filename); 
     _logger.Error("Config file deleted"); 
     Properties.Settings.Default.Upgrade(); 
     // Properties.Settings.Default.Reload(); 
     // you could optionally restart the app instead 
    } 
    else 
    { 
     _logger.Error("Config file {0} does not exist", filename); 
    } 
} 
+0

Điều này có vẻ đầy hứa hẹn, nhưng khi tôi chạy Upgrade() tôi nhận được hệ thống cấu hình không khởi tạo được. – tofutim

+0

@tofutim chính xác những gì nó nói? Và có thể thử xóa + tải lại() cuộc gọi, trên suy nghĩ thứ hai không có nâng cấp trong ứng dụng của bạn .. – avs099

+2

thực sự, tính năng này hoạt động - nhưng điều quan trọng là sử dụng openexeconfiguration thay vì gọi cho cài đặt không tốt, sau khi gọi cho xấu thiết lập sau đó bạn đang mắc kẹt với hệ thống cấu hình không khởi tạo – tofutim

4

Tôi có một tình huống tương tự. Đối với tôi, một khi tôi xóa các tập tin cấu hình xấu, tôi chỉ cho phép ứng dụng tiếp tục. Quyền truy cập tiếp theo của cài đặt sẽ sử dụng mặc định của ứng dụng.

+1

Nếu tôi xóa cấu hình và họ thử tiếp tục, nó vẫn ở trạng thái bị hỏng và ném ngoại lệ mỗi khi tôi sử dụng cài đặt cấu hình. Hệ thống cấu hình không khởi tạo được, vì vậy việc cố gắng sử dụng nó mà không cần khởi động lại sẽ không hoạt động. – JeremyK

+0

Tôi cũng gặp vấn đề tương tự ở đây. sau khi các tập tin cài đặt bị hỏng bất kỳ quyền truy cập vào thuộc tính cài đặt sẽ ném một ngoại lệ bất kể các cuộc gọi được đặt lại() hoặc tải lại() hoặc sau khi lưu(). có thể xử lý nó theo cách khác không. – TrustyCoder

4

Điều này có thể hơi muộn, nhưng tôi đã thực hiện một số nghiên cứu thêm về điều này. Tệp user.config dường như bị hỏng vì lý do không xác định và không cho phép ứng dụng bắt đầu. bạn có thể đặt một thử nghiệm nhỏ/bắt logic trong app.xaml.cs của bạn và kiểm tra khi nó khởi chạy để đảm bảo vấn đề này được bắt tại nguồn. Khi ứng dụng khởi chạy và cố gắng tải lại chương trình settings.default, và không thành công, nó sẽ đi đến ngoại lệ cho người dùng tùy chọn xóa tệp.

try { 
Settings.Default.Reload(); 
} 
catch (ConfigurationErrorsException ex) 
{ 
    string filename = ((ConfigurationErrorsException)ex.InnerException).Filename; 

if (MessageBox.Show("<ProgramName> has detected that your" + 
         " user settings file has become corrupted. " + 
         "This may be due to a crash or improper exiting" + 
         " of the program. <ProgramName> must reset your " + 
         "user settings in order to continue.\n\nClick" + 
         " Yes to reset your user settings and continue.\n\n" + 
         "Click No if you wish to attempt manual repair" + 
         " or to rescue information before proceeding.", 
         "Corrupt user settings", 
         MessageBoxButton.YesNo, 
         MessageBoxImage.Error) == MessageBoxResult.Yes) { 
    File.Delete(filename); 
    Settings.Default.Reload(); 
    // you could optionally restart the app instead 
} else 
    Process.GetCurrentProcess().Kill(); 
    // avoid the inevitable crash 
} 

Tín dụng - http://www.codeproject.com/Articles/30216/Handling-Corrupt-user-config-Settings

Hy vọng điều này sẽ giúp người :)

+2

'Reload()' không giúp ích gì. Truy cập kế tiếp vào 'Default.Foo' sẽ ném' ConfigurationErrorsException'. – Martin

+0

Xin lỗi, tôi không hiểu ý của bạn là gì ..Hàm reload() nằm trong một khối TRY, và một khi ConfigurationErrorsException bị bắt, nó sẽ xóa tập tin cấu hình và xóa ứng dụng. Khi ứng dụng wpf được khởi động lại, nó sẽ tự động tạo một tệp cấu hình trống. Đây không phải là tốt như nó có thể được, người dùng sẽ mất bất kỳ thông tin được lưu trữ trong tập tin cấu hình, nhưng ít nhất là các ứng dụng sẽ không trở thành hoàn toàn không sử dụng được. – Arun

+2

'Tải lại' thứ hai không nằm trong khối thử (nhưng điều này không liên quan) và ứng dụng sẽ chỉ bị giết khi người dùng nhấp vào" Không ". Khi người dùng nhấp vào "Có", ứng dụng sẽ tiếp tục chạy và một ngoại lệ sẽ được ném vào lần tiếp theo 'Default.Foo' sẽ được truy cập. Vâng, ít nhất là trên máy tính của tôi ... – Martin

Các vấn đề liên quan