Este artículo es un artículo espejo de traducción automática, por favor haga clic aquí para saltar al artículo original.

Vista: 31124|Respuesta: 2

[Programa de consola] Ten cuidado con System.Environment.CurrentDirectory para obtener el directorio actual

[Copiar enlace]
Publicado en 10/11/2020 15:04:17 | | | |
En mi trabajo reciente, quiero crear una pequeña herramienta para recordatorios a clientes; Naturalmente, el programa winform debe leer el archivo de configuración del mismo directorio que la aplicación (no el archivo exe.config);

Para leer el directorio donde está la aplicación actual, inmediatamente pensé en System.Environment.CurrentDirectory para obtener el directorio de trabajo actual. El programa parece funcionar a la perfección;

Cuando llegué al trabajo a la mañana siguiente, apareció: "Leer archivo de configuración perdido". La app añade arranque automático de arranque. Este mensaje aparece para leer el fallo del archivo de configuración y comprobar inmediatamente si el archivo de configuración en el directorio de la aplicación ha sido eliminado por sí solo. Tras comprobarlo, vi que el archivo seguía ahí, y salí del programa y lo ejecuté de nuevo

Sigue bien, no falta ningún perfil de lectura emergente. ¿Luego ver si la ruta de la entrada de arranque en el registro no está en mi directorio? Mirando el archivo de ruta, está bien. ¿Un poco confundido? Cierra sesión del ordenador e intento reiniciar, sigue apareciendo el archivo de configuración. La razón por la que no se puede encontrar el camino se tomará directamente

MessageBox, el programa se ejecuta y descubre que el camino es efectivamente este camino.

Añade el código MessageBox y sigue arrancando la prueba. Cuando lo inicié, vi que el directorio actual que aparecía era C:\Windows\System32, y al instante me quedé desconcertado. Pensé, ¿podría ser que el programa de Lao Tzu llegara hasta system32? Revisando el registro y sysetm32 no tiene mi app. Por último, pensé que debería haber un problema con el código para obtener la ruta.

Tras repetidas pruebas, se descubrió que System.Environment.CurrentDirectory es efectivamente para obtener el directorio actual, pero si el programa A llama al programa B y el programa B utiliza System.Environment.CurrentDirectory para obtener el directorio. Entonces, el directorio obtenido en el programa B ya no es el directorio donde se encuentra la aplicación B; Se convierte en el directorio donde se encuentra A. No es difícil encontrar que el directorio que aparece al arrancar es C:\Windows\System32 porque el programa de arranque auto-arrancado también es llamado por un proceso en Windows.

Por lo tanto, si el programa winform quiere obtener el directorio donde se encuentra la aplicación actual, es mejor no usar System.Environment.CurrentDirectory. En cambio, es: Application.StartupPath Así no importa quién lo llame.

Código de prueba:




Transferido desde:El inicio de sesión del hipervínculo es visible.




Anterior:Comparación de franela de red K8S y calicó
Próximo:C# coloca las DLL de la biblioteca de referencia en subcarpetas mediante sondeo
 Propietario| Publicado en 10/11/2020 15:08:26 |
C# es un conjunto de métodos para obtener el camino actual de ejecución del programa

Obtén la ruta completa hasta el proceso actual, incluyendo el nombre del archivo (nombre del proceso).
string str = esto. GetType(). Assembly.Location;
result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

El camino completo al módulo principal que obtiene el nuevo componente de Proceso y lo asocia con el proceso actualmente activo, incluyendo el nombre del archivo (nombre del proceso).
string str = System.Diagnostics.Process.GetCurrentProcess(). MainModule.NombreDeArchivo;
result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

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

Obtiene el directorio base del dominio de aplicación actual del Thread actual, que es utilizado por el solucionador de conflictos de ensamblador para sondear el ensamblador.
string str = System.AppDomain.CurrentDomain.BaseDirectory;
result: X:\xxx\xxx\ (.exe文件所在的目录+"\")

Obtén y establece el nombre del directorio que contiene la aplicación. (Recomendado)
string str = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
result: X:\xxx\xxx\ (.exe文件所在的目录+"\")

Obtén la ruta hacia el archivo ejecutable que inició la aplicación, excluyendo el nombre del ejecutable.
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文件名)

Obtén el directorio de trabajo actual de la aplicación (poco fiable).
string str = System.IO.Directory.GetCurrentDirectory();
result: X:\xxx\xxx (.exe文件所在的目录)
Publicado en 22/9/2021 20:38:52 |
Aprende a aprender...
Renuncia:
Todo el software, materiales de programación o artículos publicados por Code Farmer Network son únicamente para fines de aprendizaje e investigación; El contenido anterior no se utilizará con fines comerciales o ilegales; de lo contrario, los usuarios asumirán todas las consecuencias. La información de este sitio proviene de Internet, y las disputas de derechos de autor no tienen nada que ver con este sitio. Debes eliminar completamente el contenido anterior de tu ordenador en un plazo de 24 horas desde la descarga. Si te gusta el programa, por favor apoya el software genuino, compra el registro y obtén mejores servicios genuinos. Si hay alguna infracción, por favor contáctanos por correo electrónico.

Mail To:help@itsvse.com