1

我在这里尝试了多种解决方案,但没有一个我可以开始工作。我要做的就是从我的资源文件夹而不是实际的本地文件夹中读取一个文本文件。

文件名:TextFile.txt

设置为嵌入式资源。

有效的“本地文件”代码:

string[] spaces = File.ReadAllLines("C:\\Users\\a\\source\\repos\\a\\bin\\Debug\\TextFile.txt");

当前代码:

        var assembly = Assembly.GetExecutingAssembly();
        var resourceName = "TextFile.txt";

        using (Stream stream = assembly.GetManifestResourceStream(resourceName))
        using (StreamReader reader = new StreamReader(stream))
        {
            string result = reader.ReadToEnd(); 
        }

        string[] spaces = File.ReadAllLines(resourceName);

但我收到以下错误:

System.ArgumentNullException: '值不能为空。参数名称:流'

在这条线上:

using (StreamReader reader = new StreamReader(stream))

EDIT1根据链接尝试了这个(为什么在调用GetManifestResourceNames时资源名称存在时GetManifestResourceStream返回null?)和这个NULL ERROR

        var assembly = Assembly.GetExecutingAssembly();
        var resourceName = "programname.TextFile.txt";

        using (Stream stream = assembly.GetManifestResourceStream(resourceName))
        using (StreamReader reader = new StreamReader(stream))
        {
            string result = reader.ReadToEnd(); 
        }

        string[] spaces = File.ReadAllLines(resourceName);

同样的错误,我是否将命名空间位放在错误的位置?

编辑2,试过这个:

        var assembly = Assembly.GetExecutingAssembly();
        var resourceName = "programname.Resources.TextFile.txt";
        using (Stream stream = assembly.GetManifestResourceStream(resourceName))
        using (StreamReader reader = new StreamReader(stream))
        {
            string result = reader.ReadToEnd(); 
        }

        string[] spaces = File.ReadAllLines(resourceName);

新错误:

System.IO.FileNotFoundException: '找不到文件'C:\Users\a\source\repos\a\bin\Debug\programname.Resources.TextFile.txt'。'

位置TextFile.txt

programname
    Resources
        TextFile.txt 
4

2 回答 2

2

此函数将为您的文件返回正确的资源名称:

string resourceName = assembly.GetManifestResourceNames()
  .Single(str => str.EndsWith("TextFile.txt"));

第二期:

对于string[] spaces = File.ReadAllLines(resourceName); 您不能使用相同的资源名称(嵌入式资源)。如果您需要逐行阅读文本,请使用例如:

using (StreamReader reader = new StreamReader(stream))
{
   while (reader.Peek() >= 0)
   {
      Console.WriteLine(reader.ReadLine());
   }
}
于 2019-09-10T09:12:12.113 回答
2

通过打开Resources.resx,设置Access ModifierPublic然后在其中添加文件来使其工作。

然后替换:

string[] spaces = File.ReadAllLines("C:\\Users\\a\\source\\repos\\a\\bin\\Debug\\TextFile.txt")

和:

var resourceText = Properties.Resources.TextFile;
var Lines= resourceText.Replace("\r", "").Split('\n');

一点背景:

MSDN

如果您以正常方式将资源添加到项目中,它将自动为该资源提供类型安全的包装器。

例如,在解决方案资源管理器中,展开“属性”节点并双击“Resources.resx”条目。然后通过“添加资源”按钮添加图像。为该资源命名,例如“MyImage”。

然后,您将能够通过“Properties.Resources.MyImage”以编程方式访问该图像

  • 这是简单且推荐的方法;它可以让您编辑资源文件中的名称,并在编码时检查名称是否正确。

请注意,名称已去除扩展名,并且与其他 c# 名称一样,区分大小写!

  • 另一种方法不使用 .resx 文件注册资源,而只是将它们添加到资源文件夹并将它们标记为嵌入。

要使用它们,您不能使用像上面那样简单的代码。相反,您需要找出名称(Intellisense 不会帮助您)并且他们使用对Reflection命名空间的调用。

请注意,这里的名称 __not__- 去除了扩展名,但仍然区分大小写!

例子:

如果我们不知道确切的名称,我们可以在程序集中搜索:

var assembly = System.Reflection.Assembly.GetExecutingAssembly();
var ress = assembly.GetManifestResourceNames()
                   .Where(x => x.Contains(somepattern)).First();

通常推荐第一种方式。仅类型安全和 Intellisense 支持就非常值得维护 resx 文件!现在我们可以打开一个流来读取资源:

List<string> results = new List<string>(); ;
using (Stream stream = assembly.GetManifestResourceStream(ress))
using (StreamReader reader = new StreamReader(stream))
{
    while (reader.Peek()>=0) results.Add(reader.ReadLine());
}
于 2019-09-10T10:11:37.197 回答