Visual Studio中的相对路径
我正在Visual Studio 2005中工作,并添加了一个文本文件,该文件需要通过在解决方案资源管理器中右键单击该项目并添加->新项来进行解析。这会将.txt文件放置到项目文件夹中。 debug .exe文件在/ bin / debug文件夹中。
我如何使用相对路径正确地从代码指向txt文件,该路径可以正确地解决两个文件夹的问题,同时在解决方案发布后也解析为位于同一文件夹中?
解决方案
我们可以添加一个构建后事件,以将.txt文件复制到构建输出文件夹中。然后,代码可以假定该文件与可执行文件位于同一文件夹中。
我将添加一个后构建步骤,将txt文件复制到活动配置的输出文件夹中:
xcopy "$(ProjectDir)*.txt" "$(OutDir)"
定义了一些宏,例如" $(ConfigurationName)",$(ProjectDir)。
如果我正确理解了问题:在"解决方案资源管理器"中选择文件。在属性->复制到输出目录下,选择"始终复制"或者"如果更新则复制"。对于构建操作,选择"内容"。这会将文件复制到build上的/ bin / debug文件夹中。从那时起,我们应该能够从项目根目录引用它。
签出应用程序类。一旦安装了应用程序,它就有几个成员可用于相对于应用程序查找文件等。
例如,Application.ExecutablePath会告诉我们正在运行的EXE文件所在的位置。然后我们可以使用相对路径来查找文件,例如.. \ .. \ FileToBeParsed.txt。但是,这假定文件部署在与项目文件夹结构相同的文件夹结构中,通常情况并非如此。
部署项目后,请考虑CommonAppDataPath和LocalUserAppDataPath之类的属性来查找与应用程序相关的文件。
在磁盘上定位文件的另一种方法是将文件直接包含在编译的程序集中作为嵌入式资源。为此,右键单击该文件,然后选择"嵌入式资源"作为构建操作。然后,我们可以将文件作为字节流检索:
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);
有关嵌入式资源的更多信息,请参见此处和此处。
如果我们要构建供自己使用的应用程序,那么David Krep的建议是最好的:只需将文件复制到输出目录即可。如果要构建将被重用或者分发的程序集,则首选嵌入式资源选项,因为它将所有内容打包在单个.dll中。
转到项目属性->配置属性->调试
将"工作目录"设置为$(TargetDir)
然后,我们可以使用代码中的相对路径正确引用文件(例如" .... \ foo.xml")
Application.ExecutablePath解决方案不适用于单元测试。 vstesthost.exe的路径将被返回
System.Reflection.Assembly.GetExecutingAssembly()。Location可以使用,但给出包含程序集名称的路径。
所以这有效:System.Reflection.Assembly.GetExecutingAssembly()。Location +" \ .. \" +" fileToRead.txt"
只是 :
fileToRead.txt
也可以。默认情况下,似乎工作目录是执行程序集目录。