Cet article est un article miroir de traduction automatique, veuillez cliquer ici pour accéder à l’article original.

Vue: 31124|Répondre: 2

[Programme Console] Méfiez-vous de System.Environment.CurrentDirectory pour obtenir le répertoire actuel

[Copié le lien]
Publié sur 10/11/2020 15:04:17 | | | |
Dans mon travail récent, je souhaite créer un petit outil pour les rappels clients ; Naturellement, le programme winform doit lire le fichier de configuration du même répertoire que l’application (et non le fichier exe.config) ;

Pour lire le répertoire où se trouve l’application actuelle, j’ai immédiatement pensé à System.Environment.CurrentDirectory pour obtenir le répertoire de travail actuel. Le programme semble fonctionner parfaitement ;

Quand je suis arrivé au travail le lendemain matin, il est apparu : « Fichier de configuration lu manquant ». L’application ajoute un démarrage automatique au démarrage. Ce message apparaît pour lire la défaillance du fichier de configuration, vérifier immédiatement si le fichier de configuration dans le répertoire de l’application a été supprimé de lui-même. Après vérification, j’ai constaté que le fichier était toujours là, j’ai quitté le programme et l’ai relancé

Toujours bien, aucun profil de lecture contextuel manquant. Ensuite, voir si le chemin de l’entrée de démarrage dans le registre n’est pas dans mon répertoire ? En regardant le fichier de chemin, tout va bien. Un peu confus ? Je me déconnecte de l’ordinateur et j’essaie de redémarrer, il apparaît toujours que le fichier de configuration manque. La raison de l’incapacité à trouver le chemin sera directement prise en compte

MessageBox, le programme s’exécute et découvre que le chemin est bien ce chemin.

Ajoutez le code MessageBox et continuez à démarrer le test. Au démarrage, j’ai constaté que le dossier actuel qui s’affichait était C :\Windows\System32, et j’ai été tout de suite perplexe. Je me suis dit, est-ce que le programme de Lao Tzou a été mené à system32 ? En vérifiant le registre et sysetm32, mon application n’est pas disponible. Enfin, j’ai pensé qu’il devrait y avoir un problème avec le code pour obtenir le chemin.

Après de nombreux tests, il a été constaté que System.Environment.CurrentDirectory est effectivement destiné à obtenir le répertoire courant, mais si le programme A appelle le programme B et que le programme B utilise System.Environment.CurrentDirectory pour obtenir le répertoire. Alors, le répertoire obtenu dans le programme B n’est plus celui où se trouve l’application B ; Il devient le répertoire où se trouve A. Il n’est pas difficile de trouver que le dossier qui apparaît au démarrage est C :\Windows\System32, car le programme d’autodémarrage est aussi appelé par un processus sous Windows.

Par conséquent, si le programme winform souhaite obtenir le répertoire où se trouve l’application actuelle, il est préférable de ne pas utiliser System.Environment.CurrentDirectory. Au lieu de cela, c’est : Application.StartupPath Ainsi, peu importe qui l’appelle.

Code de test :




Transféré depuis :La connexion hyperlientérée est visible.




Précédent:Comparaison du réseau K8S en flanelle et en calico
Prochain:C# place les DLL de bibliothèques de référence dans des sous-dossiers via le sondage
 Propriétaire| Publié sur 10/11/2020 15:08:26 |
C# est un ensemble de méthodes pour obtenir le chemin d’exécution du programme actuel

Obtenez le chemin complet vers le processus en cours, y compris le nom du fichier (nom du processus).
string str = ceci. GetType(). Assembly.Location ;
result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

Le chemin complet vers le module principal qui reçoit le nouveau composant Process et l’associe au processus actuellement actif, y compris le nom du fichier (nom du processus).
chaîne str = System.Diagnostics.Process.GetCurrentProcess(). MainModule.FileName ;
result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

//获取和设置当前目录(即该进程从中启动的目录)的完全限定路径。
chaîne str = System.Environment.CurrentDirectory ;
result: X:\xxx\xxx (.exe文件所在的目录)

Obtient le répertoire de base du domaine d’application courant du Thread actuel, qui est utilisé par le solveur de conflits d’assembleur pour sonder l’assembleur.
string str = System.AppDomain.CurrentDomain.BaseDirectory ;
result: X:\xxx\xxx\ (.exe文件所在的目录+"\")

Obtenez et définissez le nom du répertoire contenant l’application. (Recommandé)
string str = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase ;
result: X:\xxx\xxx\ (.exe文件所在的目录+"\")

Obtenez le chemin vers le fichier exécutable qui a lancé l’application, en excluant le nom de l’exécutable.
string str = System.Windows.Forms.Application.StartupPath ;
result: X:\xxx\xxx (.exe文件所在的目录)

//获取启动了应用程序的可执行文件的路径,包括可执行文件的名称。
string str = System.Windows.Forms.Application.ExecutablePath ;
result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

Obtenez le répertoire de fonctionnement actuel de l’application (peu fiable).
string str = System.IO.Directory.GetCurrentDirectory() ;
result: X:\xxx\xxx (.exe文件所在的目录)
Publié sur 22/09/2021 20:38:52 |
Apprends à apprendre...
Démenti:
Tous les logiciels, supports de programmation ou articles publiés par Code Farmer Network sont uniquement destinés à l’apprentissage et à la recherche ; Le contenu ci-dessus ne doit pas être utilisé à des fins commerciales ou illégales, sinon les utilisateurs assumeront toutes les conséquences. Les informations sur ce site proviennent d’Internet, et les litiges de droits d’auteur n’ont rien à voir avec ce site. Vous devez supprimer complètement le contenu ci-dessus de votre ordinateur dans les 24 heures suivant le téléchargement. Si vous aimez le programme, merci de soutenir un logiciel authentique, d’acheter l’immatriculation et d’obtenir de meilleurs services authentiques. En cas d’infraction, veuillez nous contacter par e-mail.

Mail To:help@itsvse.com