首页 > 解决方案 > C#从资源中读取文本文件而不是本地错误,添加命名空间不起作用

问题描述

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

文件名: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 

标签: c#visual-studioembedded-resource

解决方案


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

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());
   }
}

推荐阅读