2012-03-05 13 views
17

Ho notato su alcune macchine in cui il file user.config della mia applicazione è in qualche modo danneggiato ed è vuoto all'apertura. Non riesco a capire perché questo è successo. C'è una cosa comune che potrebbe causare questo? Un modo per prevenirlo in sicurezza?Quali sono le cause per lo svuotamento di user.config? E come posso ripristinare senza riavviare?

La seconda domanda è come eseguire il ripristino dello stato? Rilevo l'eccezione ed elimina il file user.config, ma non riesco a trovare un modo per ripristinare la configurazione senza riavviare l'applicazione. Tutto quello che faccio sull'oggetto Proprietà causa l'errore seguente:

"sistema di configurazione è riuscito a inizializzare"

Reset, Reload, e aggiornare tutti fare nulla per risolvere il problema.

Ecco il mio codice per la cancellazione dopo che l'eccezione:

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

Se il file è user.config corrrupt, è necessario riavviare, a condizione che in realtà memorizzare valori all'interno del file del impostazione. Il motivo per cui è necessario riavviare è ovvio, se il file è danneggiato, l'applicazione è in uno stato instabile. –

+1

Questo è quello che ho capito. Speravo che ci fosse un modo per ripristinare la configurazione dell'app alle sue impostazioni predefinite in fase di esecuzione senza dover riavviare - in quanto il riavvio sembra essere molto inaffidabile. – JeremyK

+1

Possiedo un'applicazione che presenta di volta in volta questo stesso problema. Ad oggi, non ho trovato una soluzione o la causa principale di questo problema. L'applicazione è passata da .NET v3.5 a v4.0, quindi il problema è presente sia nel runtime v2.0 che v4.0. Possibile duplicato: http://stackoverflow.com/questions/3071651/how-to-catch-exception-when-loading-net-winform-app-user-config-file – harlam357

risposta

13

Abbiamo avuto questo problema nel nostro app - e non ero in grado di scoprire perché (la mia ipotesi era che stavo scrivendo a Proprietà. Impostazioni troppo spesso ma non ne sono sicuro). In ogni caso, la mia soluzione è sotto. La chiave è quella di cancellare il file corrotto e chiamare 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

Questo sembrava promettente, ma quando eseguo Upgrade() non riesco a inizializzare il sistema di configurazione. – tofutim

+0

@tofutim cosa dice esattamente? E potrebbe provare la chiamata delete + reload(), a pensarci due volte non c'era l'upgrade nella tua app .. – avs099

+2

in realtà, questo funziona - ma è importante usare openexeconfiguration invece di chiamare per una cattiva impostazione, dopo aver chiamato per il impostazione errata quindi si è bloccati con il sistema di configurazione non riuscito a inizializzare – tofutim

4

ho una situazione simile. Per me, una volta eliminato il file di configurazione errato, ho lasciato che l'applicazione continuasse. Il prossimo accesso alle impostazioni utilizzerà le impostazioni predefinite dell'applicazione.

+1

Se si elimina la configurazione e si tenta di continuare, rimane in uno stato danneggiato e genera un'eccezione ogni volta che utilizzo le impostazioni di configurazione. Il sistema di configurazione non riesce a inizializzarsi, quindi provare a usarlo senza riavviare non funzionerebbe. – JeremyK

+0

Anche qui sto riscontrando lo stesso problema. dopo che il file delle impostazioni è corrotto qualsiasi accesso alle proprietà delle impostazioni genererà un'eccezione indipendentemente dalle chiamate reset() o reload() o after save(). è possibile gestirlo in un altro modo. – TrustyCoder

4

Questo potrebbe essere un po 'tardi, ma ho fatto qualche ricerca in più su questo. Il file user.config sembra corrotto per un motivo sconosciuto e non consente l'avvio dell'app. potresti mettere una piccola logica try/catch nella tua app.xaml.cs e controllare quando si avvia per assicurarti che il problema sia stato rilevato all'origine. Quando l'app si avvia e tenta di ricaricare programatically settings.default, e fallisce, andrà all'eccezione dando all'utente la possibilità di cancellare il file.

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 
} 

credito - http://www.codeproject.com/Articles/30216/Handling-Corrupt-user-config-Settings

Spero che questo aiuti qualcuno :)

+2

'Reload()' non aiuta. Il prossimo accesso a 'Default.Foo' genererà' ConfigurationErrorsException'. – Martin

+0

Scusa, non capisco cosa intendi ..La funzione reload() si trova in un blocco TRY e, una volta rilevata ConfigurationErrorsException, eliminerà il file di configurazione e terminerà l'applicazione. Quando l'app wpf viene riavviata, creerà automaticamente un file di configurazione vuoto. Questo non è buono come potrebbe essere, l'utente perderà tutte le informazioni memorizzate nel file di configurazione, ma almeno l'applicazione non diventerà totalmente inutilizzabile. – Arun

+2

Il secondo 'Reload' non è in un blocco try (ma questo non è rilevante) e l'app verrà uccisa solo quando l'utente fa clic su" No ". Quando l'utente fa clic su "Sì", l'app continuerà a funzionare e verrà lanciata un'eccezione la prossima volta che verrà effettuato l'accesso a "Default.Foo'. Beh, almeno sul mio computer ... – Martin

Problemi correlati