Nel mio lavoro recente, voglio creare un piccolo strumento per i promemoria ai clienti; Naturalmente, il programma winform deve leggere il file di configurazione della stessa directory dell'applicazione (non il file exe.config);
Per leggere la directory dove si trova l'applicazione attuale, ho subito pensato a System.Environment.CurrentDirectory per ottenere la directory di lavoro attuale. Il programma sembra funzionare alla perfezione;
Quando sono arrivato al lavoro la mattina dopo, è apparso: "Leggi file di configurazione mancante". L'app aggiunge l'avvio automatico di avvio. Questo messaggio appare per leggere il fallimento del file di configurazione, verificando immediatamente se il file di configurazione nella directory dell'applicazione è stato eliminato da solo. Dopo aver controllato, ho scoperto che il file era ancora lì, ho chiuso il programma e l'ho eseguito di nuovo
Ancora tutto a posto, nessun profilo di lettura pop-up manca. Poi vedere se il percorso della voce di avvio nel registro non è nella mia directory? Guardando il file di percorso, va tutto bene. Un po' confuso? Esci dal computer e provo a riavviare, ma continua a comparire il file di configurazione mancante. La ragione per cui non si riesce a trovare la strada verrà presa direttamente
MessageBox, il programma si avvia e scopre che il percorso è effettivamente questo.
Aggiungi il codice MessageBox e continua ad avviare il test. Quando ho avviato, ho scoperto che la directory attuale che compariva era C:\Windows\System32, e sono rimasto subito perplesso. Mi sono chiesto: potrebbe essere che il programma di Lao Tzu sia arrivato fino a system32? Controllo nel registro e sysetm32 non c'è la mia app. Infine, ho pensato che dovesse esserci un problema con il codice per ottenere il percorso.
Dopo ripetuti test, si scoprì che System.Environment.CurrentDirectory è effettivamente per ottenere la directory corrente, ma se il programma A chiama il programma B e il programma B usa System.Environment.CurrentDirectory per ottenere la directory. Allora la directory ottenuta nel programma B non è più quella in cui si trova l'applicazione B; Diventa la directory dove si trova A. Non è difficile trovare che la directory che appare quando avvio è C:\Windows\System32 perché il programma di avvio automatico viene chiamato anche da un processo in Windows.
Pertanto, se il programma winform vuole ottenere la directory in cui si trova l'applicazione corrente, è meglio non usare System.Environment.CurrentDirectory. Invece, è: Application.StartupPath In questo modo, non importa chi lo chiama.
Codice di test:
Trasferito da:Il login del link ipertestuale è visibile.
|