none
user.config RRS feed

  • Domanda

  • Salve a tutti,

    Una domanda, se potete essermi d'aiuto.

    Ho un'applicazione fatta in c# (.NET 3.5) con i suoi parametri di configurazione, alcuni dei quali di "ambito user".

    Questi vengono quindi salvati da Windows in un percorso che, se non mi erro, non conosco a priori. un percorso del tipo "C:\Users\cuser\AppData\Local\Developerx\ApplicationFileName_Url_giot22i2enymodq22rxkna2ohqhcatyd\3.0.0.0\user.config"

    Normalmente tutto bene, ma mi è capitato qualche volta questo file per qualche motivo si corrompesse (tipo per arresto forzato del PC da parte dell'utente "indisciplinato"...), mandando in eccezione il tutto.

    Ora, vorrei gestire l'eccezione e capire se il file user.config è un file XML valido oppure no (appunto perchè corrotto), ma non so come recuperare il percorso corretto del file.

    Ho provato con questo:

    var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);  
    string fp = config.FilePath;

    ma con file corrotto non mi permette di ottenere quello che voglio, va anch'esso in eccezione.

    Sapete dirmi come posso recuperare questa informazione in modo sicuro??

    Grazie!


    • Modificato mymark venerdì 13 dicembre 2013 17:54
    venerdì 13 dicembre 2013 17:53

Risposte

  • Sempre a proposito di questo tema, l'unico "tampone" che mi è venuto in mente attualmente è di intercettare il messaggio della InnerException sollevato dalla ConfigurationErrorsException, dove è riportato percorso e file che non permettono l'avvio del programma. Se il file è quello atteso (user.config) allora provvedo a farmene una copia (come log) ed eliminarlo.

    try
    {
       // Provo a caricare un dato
       DateTime ck = InfoScheduler.Default.UltimaDataReport;
    }
    catch (ConfigurationErrorsException ex)
    {
        // InnerException mi riporta il file che ha generato l'arresto imprevisto
        // Me lo aspetto nel formato "descrizione anomalia (@percorso)"
        string[] iex = ex.InnerException.Message.Split(new char[] {'(', ')'});
        string xPath = String.Empty;
        foreach (string s in iex)
        {
           if (s.Length < 12) continue;
           string s1 = s.Substring(0, s.LastIndexOf(@"\user.config") + 12);
           if (File.Exists(s1) && s1.EndsWith("user.config"))
           {
              xPath = s1;
              break;
           }
        }
    ...

    è tutt'altro che elegante e "professionale", ma è l'unica soluzione che mi è venuta in mente (si tratta, in fin dei conti, di un evento eccezionale che non dovrebbe mai verificarsi... in teoria).

    Condivido per eventuali commenti e/o aiuti.

    Grazie

    • Contrassegnato come risposta Irina Turcu venerdì 27 dicembre 2013 13:15
    lunedì 16 dicembre 2013 09:05

Tutte le risposte

  • Sempre a proposito di questo tema, l'unico "tampone" che mi è venuto in mente attualmente è di intercettare il messaggio della InnerException sollevato dalla ConfigurationErrorsException, dove è riportato percorso e file che non permettono l'avvio del programma. Se il file è quello atteso (user.config) allora provvedo a farmene una copia (come log) ed eliminarlo.

    try
    {
       // Provo a caricare un dato
       DateTime ck = InfoScheduler.Default.UltimaDataReport;
    }
    catch (ConfigurationErrorsException ex)
    {
        // InnerException mi riporta il file che ha generato l'arresto imprevisto
        // Me lo aspetto nel formato "descrizione anomalia (@percorso)"
        string[] iex = ex.InnerException.Message.Split(new char[] {'(', ')'});
        string xPath = String.Empty;
        foreach (string s in iex)
        {
           if (s.Length < 12) continue;
           string s1 = s.Substring(0, s.LastIndexOf(@"\user.config") + 12);
           if (File.Exists(s1) && s1.EndsWith("user.config"))
           {
              xPath = s1;
              break;
           }
        }
    ...

    è tutt'altro che elegante e "professionale", ma è l'unica soluzione che mi è venuta in mente (si tratta, in fin dei conti, di un evento eccezionale che non dovrebbe mai verificarsi... in teoria).

    Condivido per eventuali commenti e/o aiuti.

    Grazie

    • Contrassegnato come risposta Irina Turcu venerdì 27 dicembre 2013 13:15
    lunedì 16 dicembre 2013 09:05
  • Ciao mymark,

    Puoi provare a mettere l'istruzione

    var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);

    in un blocco try...catch. Non ho modo ora di provare, ma mi chiedo se, anche se spunta l'eccezione, l'oggetto config viene popolato in modo di poter estrarne ulteriorimente la proprieta' FilePath.

    Per quanto riguarda la posizione del file user.config, e' infatti un po' difficile da intuirla senza l'utilizzo del metodo descritto sopra. Cittando da MSDN:

    Posizioni dei file delle impostazioni

    La posizione dei file app.exe.config e utente.config dipende dalla modalità di installazione dell'applicazione. Per un'applicazione basata su Windows Form copiata nel computer locale, il file app.exe.config si troverà nella stessa directory della directory di base del file eseguibile principale dell'applicazione, mentre utente.config risiederà nel percorso specificato dalla proprietà Application.LocalUserAppDataPath. username\Local Settings." id="mt50">Per un'applicazione installata tramite ClickOnce, entrambi i file risiederanno nella directory Dati ClickOnce nel percorso %InstallRoot%\\Documents and Settings\\nomeutente\Impostazioni locali.

    La posizione di archiviazione dei file è leggermente diversa se l'utente ha attivato i profili comuni in quanto ciò gli consente di definire impostazioni di Windows e di applicazione diverse quando utilizza altri computer all'interno di un dominio. In tal caso tanto per le applicazioni ClickOnce quanto per quelle non ClickOnce i file app.exe.config e utente.config verranno archiviati in %InstallRoot%\\Documents and Settings\nomeutente\Dati applicazioni.

    Allo stesso tempo, questo articolo suggerisce come estrarre la cartella base dove si trova il file, ma non so se solo questa informazione ti possa aiutare.


    <QUESTO CONTENUTO È DISTRIBUITO "AS IS", ESCLUDENDO OGNI FORMA DI RESPONSABILITÀ DI QUALUNQUE GENERE, ESPLICITA O IMPLICITA>

    Grazie
    Il Supporto delle Comunità MSDN

    Vi preghiamo di ricordare a “Segnare come Risposta” i post che risolvono il vostro problema. Questa è di solito una modalità di riconoscimento verso chi vi ha aiutati, facilitando per il futuro la scoperta della risoluzione per gli altri visitatori.


    • Modificato Irina Turcu giovedì 19 dicembre 2013 13:30 Formattazione HTML.
    mercoledì 18 dicembre 2013 11:59
  • Ciao Irina, Grazie x risposta ed articolo citato. Provo con il trappare la chiamata per vedete se funziona e faccio sapere. ;)
    mercoledì 18 dicembre 2013 19:09
  • Ciao mymark,

    Puoi provare a mettere l'istruzione

    var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);

    in un blocco try...catch. Non ho modo ora di provare, ma mi chiedo se, anche se spunta l'eccezione, l'oggetto config viene popolato in modo di poter estrarne ulteriorimente la proprieta' FilePath.

    ...


    Ciao,

    Ho provato questo giro, ma non mi sembra funzioni.

    Per ora mi tengo il metodo "tampone grossolano" scritto sopra, non mi viene in mente altro...

    Grazie

    martedì 24 dicembre 2013 10:15