在 wpf 应用程序的根目录中查找文件
finding file in root of wpf application
我正在尝试使用 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();
我不熟悉您尝试实现此目标的方式。我用不同的方式解决这类问题:
首先,将您尝试访问的文件嵌入到您的应用程序中。这是通过将文件的构建步骤-属性(属性-Window,当在 VS 中选择文件时)设置为 Embedded Resource.
在您的应用程序中,您可以像这样接收到该资源的流:
var stream = this.GetType().Assembly.GetManifestResourceStream("Namespace.yourfile.txt");
如果您不确定必须传递给 GetManifestResourceStream(..)
的字符串,您可以检查可用的嵌入式资源并查找与您的文件相关的资源,如下所示:
var embeddedResources = this.GetType().Assembly.GetManifestResourceNames()
首先,确保在编译时将文件明确复制到输出 ./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。
我正在尝试使用 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();
我不熟悉您尝试实现此目标的方式。我用不同的方式解决这类问题:
首先,将您尝试访问的文件嵌入到您的应用程序中。这是通过将文件的构建步骤-属性(属性-Window,当在 VS 中选择文件时)设置为 Embedded Resource.
在您的应用程序中,您可以像这样接收到该资源的流:
var stream = this.GetType().Assembly.GetManifestResourceStream("Namespace.yourfile.txt");
如果您不确定必须传递给 GetManifestResourceStream(..)
的字符串,您可以检查可用的嵌入式资源并查找与您的文件相关的资源,如下所示:
var embeddedResources = this.GetType().Assembly.GetManifestResourceNames()
首先,确保在编译时将文件明确复制到输出 ./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。