2008-10-03 22 views
9

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 agregando -> nuevo elemento. Esto coloca el archivo .txt en la carpeta del proyecto. El archivo Debug .exe se encuentra en la carpeta/bin/debug.Rutas relativas en Visual Studio

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

+0

Me gustaría saber esto también. Siempre me he sentido frustrado, pero las estrictas rutas de código en VS. Especialmente cuando tienes archivos de compilación nant. – flukus

Respuesta

5

Echa un vistazo a Application Class. Tiene varios miembros que se pueden usar para localizar archivos, etc. relativos a la aplicación una vez que se ha instalado.

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

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

1

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

3

Yo añadiría un paso de generación post que copia el archivo txt en la carpeta de salida de la configuración activa:

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

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

9

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

4

Una alternativa para ubicar el archivo en el disco sería incluir el archivo directamente en el ensamblado compilado como un recurso incrustado. Para hacer esto, haga clic derecho en el archivo y seleccione "Recurso incrustado" como la acción de compilació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); 

Más información acerca de los recursos incrustados se puede encontrar here y here.

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

1

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

Set "directorio de trabajo" a $ (TargetDir)

A continuación, se puede hacer referencia correctamente su archivo usando una ruta relativa en el código (por ejemplo " .... \ foo.xml ")

2

La solución Application.ExecutablePath no funciona para unittest. El camino de vstesthost.exe se devolverá

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

Así funciona esto:
System.Reflection.Assembly.GetExecutingAssembly().Location + "\..\" + "fileToRead.txt"

Pero así:

fileToRead.txt 

obras también. Parece que el directorio de trabajo es el directorio del ensamblaje de ejecución por defecto.

Cuestiones relacionadas