在wpf应用程序的根目录中查找文件

时间:2015-06-23 07:54:57

标签: c# xml wpf visual-studio relative-path

我正在尝试使用pack:// application加载文件:该文件位于我的项目的根目录中,但我一直收到空引用错误。但是当我进行绝对引用时,它会找到文件并加载就好了。 我在这里缺少什么?

这不起作用

var txt = Application.GetContentStream(new Uri(@"pack://application:,,,/Layout.xml"));
string full = new StreamReader(txt.Stream).ReadToEnd();

或Pack:// Application ,,, /

的任何变体

这有效,但我不想使用它,无论如何似乎都是不好的做法

var path = AppDomain.CurrentDomain.BaseDirectory.Substring(0, (AppDomain.CurrentDomain.BaseDirectory.Length - 10));
var txt = path + @"Layout.xml";
string full = new StreamReader(txt).ReadToEnd();

2 个答案:

答案 0 :(得分:3)

首先,确保在编译时将文件明确复制到输出./bin/目录中:

enter image description here

这在我的WPF应用程序中非常适合我:

const string imagePath = @"pack://application:,,,/Test.txt";
StreamResourceInfo imageInfo = Application.GetResourceStream(new Uri(imagePath));
byte[] imageBytes = ReadFully(imageInfo.Stream);

如果你想把它读成二进制(例如读取一个图像文件),你需要这个帮助函数。当您正在阅读.xml文件时,您可能不会需要此功能。

public static byte[] ReadFully(Stream input)
{
    byte[] buffer = new byte[16 * 1024];
    using (MemoryStream ms = new MemoryStream())
    {
        int read;
        while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
        {
            ms.Write(buffer, 0, read);
        }
        return ms.ToArray();
    }
}

有关详情,请参阅Microsoft on Pack URIs in WPF

答案 1 :(得分:0)

我不熟悉你试图实现这一目标的方式。我用不同的方式解决这类问题:

首先,在您的应用程序中嵌入您尝试访问的文件。这是通过将文件的Build-Step-Property(在VS中选择文件时属性窗口)设置为嵌入式资源来完成的。

在您的应用程序中,您可以像这样接收该资源的流:

java.util.Objects.toString(myObject, "")

如果您不确定要传递给var stream = this.GetType().Assembly.GetManifestResourceStream("Namespace.yourfile.txt"); 的字符串,您可以检查可用的嵌入资源,并查找与您的文件相关联的资源,如下所示:

GetManifestResourceStream(..)