在不使用其绝对路径的情况下引用项目内的文件?

时间:2017-10-16 19:42:01

标签: c#

我正在使用StreamReader动态替换HTML模板中的内容。 HTML文件已导入我的项目中。

现在我不得不在我的开发盒上引用HTML文件一个静态位置,因为一旦导入到我的VS项目中,我就无法找到正确的语法来引用它。

如何在不使用绝对路径的情况下引用文件?

目前的实施参考:

StreamReader reader = new StreamReader(@"C:\Users\n00b\Desktop\EmailTemplate.html");
{
     body = reader.ReadToEnd();
}

4 个答案:

答案 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)

我找到了两个解决方案:

  1. 如果您不关心外部文件是否在应用的构建目录/ installdir中可见:

            StreamReader reader = new StreamReader(@"../../EmailTemplate.html");
            {
                 body = reader.ReadToEnd();
            }
    
  2. 如果您希望外部文件在编译后不可见:

        var embeddedResource = "<namespace>.EmailTemplate.html";
        using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(embeddedResource))
        {
            StreamReader sr = new StreamReader(stream);
            body = sr.ReadToEnd();
        }
    
  3. 注意第二个解决方案需要在Visual Studio中的该文件的属性菜单上添加外部文件并将构建操作更改为“Embedded Resource”。