【问题标题】:finding file in root of wpf application在 wpf 应用程序的根目录中查找文件
【发布时间】:2015-06-23 07:54:56
【问题描述】:

我正在尝试使用 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();

【问题讨论】:

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


【解决方案1】:

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

这在我的 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

【讨论】:

  • 如果您要访问的文件位于 Visual Studio 解决方案文件夹的任何子文件夹中,编译时它将被复制到该子文件夹中。您需要调整pack:// 字符串中的路径。
【解决方案2】:

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

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

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

var stream = this.GetType().Assembly.GetManifestResourceStream("Namespace.yourfile.txt");

如果您不确定必须传递给GetManifestResourceStream(..) 的字符串,您可以检查可用的嵌入式资源并查找与您的文件相关的资源,如下所示:

var embeddedResources = this.GetType().Assembly.GetManifestResourceNames()

【讨论】:

    猜你喜欢
    • 2012-01-11
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多