我正在使用StreamReader动态替换HTML模板中的内容。 HTML文件已导入我的项目中。
现在我不得不在我的开发盒上引用HTML文件一个静态位置,因为一旦导入到我的VS项目中,我就无法找到正确的语法来引用它。
如何在不使用绝对路径的情况下引用文件?
目前的实施参考:
StreamReader reader = new StreamReader(@"C:\Users\n00b\Desktop\EmailTemplate.html");
{
body = reader.ReadToEnd();
}
答案 0 :(得分:0)
我看到的一个常见问题是将文件的位置放在配置文件中。这使您可以随意更改文件位置,而无需重新编译。
答案 1 :(得分:0)
您可以将其添加为嵌入式资源并以这种方式提取。
using (Stream stream = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("<namespace>.Resources.EmailTemplate.html"))
根据你的评论
using (System.IO.StreamReader sr = new StreamReader(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("<namespace>.Resources.EmailTemplate.html"))
{
body = sr.ReadToEnd();
}
答案 2 :(得分:0)
有两种主要方法可以执行此操作:在桌面应用程序中,.exe的当前目录设置为默认启动它的目录。除非通过使用特殊设置的快捷方式启动.exe或使用特殊功能的其他进程启动更改,否则它应该是默认值。如果是这种情况,您可以使用相对路径。例如,如果您有一个名为&#34; data.txt&#34;的文件。在一个名为&#34; thing&#34;的文件夹中。在名为&#34; stuff&#34;的文件夹中在与您的应用程序相同的目录中,您可以使用相对路径&#34; stuff / things / data.txt&#34;直接和Windows将为您解决。
如果您需要绝对确定要定位该文件,即使应用程序使用修改后的当前目录启动,您也可以获取.exe的路径,并使用{{1将其与相对路径组合}}。
System.IO.Path.Combine
如果由于某种原因,你需要向上&#34; up&#34;从应用程序的目录中,您可以使用&#34; ..&#34;表示目录的父文件夹。所以&#34; ../ data.txt&#34;会在包含的文件夹中查找名为&#34; data.txt&#34;的文件的当前目录。
当它开始是.exe的目录时,您也可以更改应用程序的当前目录,然后通过相对路径引用所有内容,如第一个示例所示。
var appPath = Assembly.GetEntryAssembly().Location;
var filePath = "stuff/things/data.txt"
var fullPath = System.IO.Path.Combine(appPath, filePath)
答案 3 :(得分:-1)
我找到了两个解决方案:
如果您不关心外部文件是否在应用的构建目录/ installdir中可见:
StreamReader reader = new StreamReader(@"../../EmailTemplate.html");
{
body = reader.ReadToEnd();
}
如果您希望外部文件在编译后不可见:
var embeddedResource = "<namespace>.EmailTemplate.html";
using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(embeddedResource))
{
StreamReader sr = new StreamReader(stream);
body = sr.ReadToEnd();
}
注意第二个解决方案需要在Visual Studio中的该文件的属性菜单上添加外部文件并将构建操作更改为“Embedded Resource”。