Pregunta

Estoy trabajando en Visual Studio 2005 y he agregado un archivo de texto que debe analizarse haciendo clic con el botón derecho en el proyecto en el explorador de soluciones y agregue - > nuevo artículo. Esto coloca el archivo .txt en la carpeta del proyecto. El archivo .exe de depuración está en la carpeta / bin / debug.

¿Cómo apunto correctamente al archivo txt desde el código que usa rutas relativas que resolverán correctamente dos carpetas atrás, mientras que también resuelvo estar en la misma carpeta después de que se publique la solución?

¿Fue útil?

Solución

Consulte la Clase de aplicación . Tiene varios miembros que se pueden usar para localizar archivos, etc. relacionados con la aplicación una vez que se haya instalado.

Por ejemplo, Application.ExecutablePath le indica dónde se encuentra el archivo EXE en ejecución; luego podría usar una ruta relativa para encontrar el archivo, p. ej. .. \ .. \ FileToBeParsed.txt. Sin embargo, esto supone que los archivos se implementan en la misma estructura de carpetas que la estructura de carpetas del proyecto, lo que no suele ser el caso.

Considere propiedades como CommonAppDataPath y LocalUserAppDataPath para ubicar los archivos relacionados con la aplicación una vez que se haya implementado un proyecto.

Otros consejos

Si entiendo su pregunta correctamente: seleccione el archivo en el " Explorador de soluciones " ;. En propiedades - > Copiar en el directorio de salida, seleccione " Copiar siempre " o " Copiar si es más reciente " ;. Para la acción de compilación, seleccione " Contenido " ;. Esto copiará el archivo a la carpeta / bin / debug en la compilación. Debería poder hacer referencia a él desde la raíz del proyecto a partir de ese momento.

Una alternativa a la ubicación del archivo en el disco sería incluir el archivo directamente en el ensamblaje compilado como un recurso incrustado. Para hacer esto, haga clic con el botón derecho en el archivo y seleccione " Recurso incrustado " como la acción de construcción. A continuación, puede recuperar el archivo como un flujo de bytes:

Assembly thisAssembly = Assembly.GetExecutingAssembly();
Stream stream = thisAssembly.GetManifestResourceStream("Namespace.Folder.Filename.Ext");
byte[] data = new byte[stream.Length];
stream.Read(data, 0, (int)stream.Length);

Puede encontrar más información sobre los recursos integrados aquí y aquí .

Si está creando una aplicación para su propio uso, la sugerencia de David Krep es la mejor: simplemente copie el archivo al directorio de salida. Si está construyendo un ensamblaje que se reutilizará o distribuirá, entonces la opción de recurso incrustado es preferible porque empaquetará todo en un solo archivo .dll.

Agregaría un paso de compilación posterior que copie el archivo txt en la carpeta de salida de la configuración activa:

xcopy "$(ProjectDir)*.txt" "$(OutDir)"

Hay algunas macros definidas, como " $ (ConfigurationName) " , $(ProjectDir )

Ir a Propiedades del proyecto - > Propiedades de configuración - > Depuración

Establecer " Directorio de trabajo " a $ (TargetDir)

Luego puede hacer referencia a su archivo correctamente usando una ruta relativa en su código (por ejemplo, " .... \ foo.xml ")

La solución Application.ExecutablePath no funciona para las pruebas de unidad. Se devolverá la ruta de vstesthost.exe

System.Reflection.Assembly.GetExecutingAssembly (). La ubicación funcionará pero proporciona la ruta con el nombre del conjunto incluido.

Así que esto funciona:
System.Reflection.Assembly.GetExecutingAssembly (). Ubicación + " \ .. \ " + " fileToRead.txt "

Pero solo:

fileToRead.txt

Funciona también. Parece que el directorio de trabajo es el directorio de ensamblado en ejecución por defecto.

Puede agregar un evento posterior a la compilación para copiar el archivo .txt en la carpeta de salida de la compilación. Luego, su código puede asumir que el archivo está en la misma carpeta que el ejecutable.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top