Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C从资源中读取文本文件而不是本地错误,添加命名空间无效_C#_Visual Studio_Embedded Resource - Fatal编程技术网

C# C从资源中读取文本文件而不是本地错误,添加命名空间无效

C# C从资源中读取文本文件而不是本地错误,添加命名空间无效,c#,visual-studio,embedded-resource,C#,Visual Studio,Embedded Resource,我在这里尝试了多种解决方案,但没有一种我可以开始工作。我只想从我的资源文件夹而不是实际的本地文件夹中读取一个文本文件 文件名:TextFile.txt 设置为嵌入式资源 工作的本地文件代码: string[] spaces = File.ReadAllLines("C:\\Users\\a\\source\\repos\\a\\bin\\Debug\\TextFile.txt"); 当前代码: var assembly = Assembly.GetExecutingAssemb

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

文件名: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:'值不能为null。 参数名称:流'

在这一行:

using (StreamReader reader = new StreamReader(stream))
EDIT1根据链接尝试了此操作,如下所示:

同样的错误,我是否将名称空间位放错了位置

编辑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的位置


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

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

对于字符串[]空格=File.ReadAllLinesresourceName; 不能使用相同的resourceName嵌入式资源。如果需要逐行阅读文本,请使用以下示例:

using (StreamReader reader = new StreamReader(stream))
{
   while (reader.Peek() >= 0)
   {
      Console.WriteLine(reader.ReadLine());
   }
}

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

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

对于字符串[]空格=File.ReadAllLinesresourceName; 不能使用相同的resourceName嵌入式资源。如果需要逐行阅读文本,请使用以下示例:

using (StreamReader reader = new StreamReader(stream))
{
   while (reader.Peek() >= 0)
   {
      Console.WriteLine(reader.ReadLine());
   }
}

通过打开Resources.resx,将Access修饰符设置为Public,然后将文件添加到其中来实现这一点

然后替换为:

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

一点背景:

:

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

例如,在解决方案资源管理器中,展开“属性”节点 然后双击Resources.resx条目。然后通过 添加资源按钮。给那个资源起个名字,比如说MyImage

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

这是一种简单且推荐的方法;它将允许您编辑资源文件中的名称,并在编码时检查名称是否正确。 请注意,这些名称没有扩展名,并且与其他c名称一样,区分大小写

另一种方法是不向.resx文件注册资源,只将它们添加到资源文件夹并将其标记为嵌入。 要使用它们,你不能使用像上面那样简单的代码。相反,您需要找出Intellisense名称在这方面对您没有帮助,并且他们使用对反射命名空间的调用

请注意,这里的名称没有去掉扩展名,但仍然区分大小写

例如:

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

var assembly = System.Reflection.Assembly.GetExecutingAssembly();
var ress = assembly.GetManifestResourceNames()
                   .Where(x => x.Contains(somepattern)).First();
通常,第一种方式是非常推荐的。仅凭Typesafety和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());
}

通过打开Resources.resx,将Access修饰符设置为Public,然后将文件添加到其中来实现这一点

然后替换为:

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

一点背景:

:

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

例如,在解决方案资源管理器中,展开“属性”节点 然后双击Resources.resx条目。然后通过 添加资源按钮。给那个资源起个名字,比如说MyImage

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

这是一种简单且推荐的方法;它将允许您编辑资源文件中的名称,并在编码时检查名称是否正确。 请注意,这些名称没有扩展名,并且与其他c名称一样,区分大小写

另一种方法是不向.resx文件注册资源,只将它们添加到资源文件夹并将其标记为嵌入。 要使用它们,你不能使用像上面那样简单的代码。相反,您需要找出Intellisense名称在这方面对您没有帮助,并且他们使用对反射命名空间的调用

请注意,这里的名称没有去掉扩展名,但仍然区分大小写

例如:

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

var assembly = System.Reflection.Assembly.GetExecutingAssembly();
var ress = assembly.GetManifestResourceNames()
                   .Where(x => x.Contains(somepattern)).First();
通常,第一种方式是非常推荐的。仅凭Typesafety和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());
}

程序集的根命名空间是什么?是程序名吗?TextFile.txt是否直接位于此程序集或子文件夹中?请添加此信息ProgramName是namspace&TextFile.txt位于resources文件夹中。。。programname>Resources>TextFile.txt然后尝试执行以下var resourceName=programname.Resources.TextFile.txt;刚试过,不同的错误。。。System.IO.FileNotFoundException:'无法为
索引文件“C:\Users\a\source\repos\a\bin\Debug\programname.Resources.TextFile.txt”。哪一行导致错误?是Assembly.GetExecutionGassembly;等于programname?程序集的根命名空间是什么?是程序名吗?TextFile.txt是否直接位于此程序集或子文件夹中?请添加此信息ProgramName是namspace&TextFile.txt位于resources文件夹中。。。programname>Resources>TextFile.txt然后尝试执行以下var resourceName=programname.Resources.TextFile.txt;刚试过,不同的错误。。。System.IO.FileNotFoundException:'找不到文件'C:\Users\a\source\repos\a\bin\Debug\programname.Resources.TextFile.txt'。哪一行导致错误?是Assembly.GetExecutionGassembly;等于programname?我替换了var resourceName=programname.Resources.TextFile.txt;字符串resourceName=assembly.GetManifestResourceNames.Singlestr=>str.EndsWithTextFile.txt;相同的error@Matt看看我的回答。如果这有意义,解决你的问题?简单地说,ReadAllLines需要的是物理路径,而不是资源名我替换了var resourceName=programname.Resources.TextFile.txt;字符串resourceName=assembly.GetManifestResourceNames.Singlestr=>str.EndsWithTextFile.txt;相同的error@Matt看看我的回答。如果这有意义,解决你的问题?简单地说,ReadAllLines需要的是物理路径,而不是资源名称。我冒昧地更改了名称,好吗?@TaW绝对:我又做了一次;我添加了另一种方法,即不在resx文件中注册资源。我冒昧地更改了答案,好吗?@TaW绝对:我又做了一次;我添加了另一种方法,即不在resx文件中注册资源。