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