我在 Visual Studio 2005 中工作,并添加了一个文本文件,需要通过在解决方案资源管理器中右键单击项目并添加 --> 新项目来解析该文件。这会将 .txt 文件放置到项目文件夹中。调试 .exe 文件位于 /bin/debug 文件夹中。
如何使用可以正确解析两个文件夹的相对路径从代码中正确指向 txt 文件,同时在解决方案发布后也解析为位于同一文件夹中?
我在 Visual Studio 2005 中工作,并添加了一个文本文件,需要通过在解决方案资源管理器中右键单击项目并添加 --> 新项目来解析该文件。这会将 .txt 文件放置到项目文件夹中。调试 .exe 文件位于 /bin/debug 文件夹中。
如何使用可以正确解析两个文件夹的相对路径从代码中正确指向 txt 文件,同时在解决方案发布后也解析为位于同一文件夹中?
如果我正确理解您的问题:在“解决方案资源管理器”中选择文件。在属性 --> 复制到输出目录下,选择“始终复制”或“如果更新则复制”。对于构建操作,选择“内容”。这会将文件复制到构建时的 /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 中。
我会添加一个后期构建步骤,将 txt 文件复制到活动配置的输出文件夹中:
xcopy "$(ProjectDir)*.txt" "$(OutDir)"
定义了一些宏,例如 " $(ConfigurationName)"
,$(ProjectDir)
转到项目属性-> 配置属性-> 调试
将“工作目录”设置为 $(TargetDir)
然后您可以使用代码中的相对路径正确引用您的文件(例如“....\foo.xml”)
Application.ExecutablePath 解决方案不适用于单元测试。将返回 vstesthost.exe 的路径
System.Reflection.Assembly.GetExecutingAssembly().Location 将起作用,但会给出包含程序集名称的路径。
所以这有效:
System.Reflection.Assembly.GetExecutingAssembly().Location + "\..\" + "fileToRead.txt"
只是 :
fileToRead.txt
也有效。似乎工作目录是默认执行的程序集目录。
您可以添加构建后事件以将 .txt 文件复制到构建输出文件夹。然后您的代码可以假定该文件与可执行文件位于同一文件夹中。