从嵌入的文本文件中使用 File.ReadAllLines



我一直在应用我迄今为止在Bob Tabors绝对初学者系列中学到的知识,我为我的女儿写了一个小型控制台文字游戏,需要我随机生成一个5个字母的单词。

我以前使用File.ReadAllLines(path)从系统上的文本文件 (wordlist.txt) 生成字符串数组,Random.next生成我将从数组中提取的索引。

我从这里的一些帖子中学到了如何将文件嵌入为资源,但现在我找不到指向它的语法(路径)。还是现在它被嵌入了,我是否必须以不同的方式访问它?

提前致谢

如果没有一个好的、最小的完整的代码示例,就不可能提供具体的建议。

但是,基本问题是:当您将文件嵌入为资源时,它不再是文件。也就是说,原始文件仍然存在,但资源本身无论如何都不是文件。它作为某种特定类型的数据存储在程序集中;从文件源嵌入的资源通常最终作为二进制数据对象结束。

如何使用这些数据取决于您所说的"嵌入"是什么意思。实际上有两种常用方法可以在 C# 程序中存储资源:可以在项目中使用"Resources"对象,该对象通过项目的...Properties.Resources类(而 类又使用 .NET 中的ResourceManager类)公开资源。或者,您可以简单地将文件添加到项目本身,然后选择"嵌入式资源"构建选项。

如果您使用的是"资源"设计器,则可以通过几种不同的方式添加文件。一种是使用"新文本文件..."选项,它允许您在资源中复制/粘贴或键入新文本。这在代码中作为Properties.Resources对象的string属性公开。如果使用"现有文件..."添加资源,也会发生同样的事情。选项,然后选择Visual Studio识别为文本文件的文件。

否则,该文件将作为Properties.Resources类中的属性公开的byte[]对象包含在内。

如果使用了"嵌入的资源"生成选项而不是"资源"设计器,则可以通过调用返回Stream对象Assembly.GetManifestResourceStream(string)方法即可使用数据。这可以包装在StreamReader中,以允许逐行读取。

File.ReadAllLines(string)方法的直接替代品如下所示...

使用"嵌入式资源":

string[] ReadAllResourceLines(string resourceName)
{
using (Stream stream = Assembly.GetEntryAssembly()
.GetManifestResourceStream(resourceName))
using (StreamReader reader = new StreamReader(stream))
{
return EnumerateLines(reader).ToArray();
}
}
IEnumerable<string> EnumerateLines(TextReader reader)
{
string line;
while ((line = reader.ReadLine()) != null)
{
yield return line;
}
}

使用Properties.Resources

使用Properties.Resources类时,可以执行类似的操作。它看起来几乎相同:

string[] ReadAllResourceLines(string resourceText)
{
using (StringReader reader = new StringReader(resourceText))
{
return EnumerateLines(reader).ToArray();
}
}

调用类似string[] allLines = ReadAllResourceLines(Properties.Resources.MyTextFile);,其中MyTextFile是您在设计器中添加的资源的属性名称(即您在第二个示例中传递string是文件本身的文本,而不是资源的名称)。

如果添加了 Visual Studio 无法识别为文本文件的现有文件,则属性类型将为byte[]而不是string,并且需要另一种略有不同的方法:

string[] ReadAllResourceLines(byte[] resourceData)
{
using (Stream stream = new MemoryStream(resourceData))
using (StreamReader reader = new StreamReader(stream))
{
return EnumerateLines(reader).ToArray();
}
}

请注意,在所有三个示例中,关键是数据最终包装在TextReader实现中,然后用于单独读取每一行,以填充数组。这些都使用我上面显示的相同的EnumerateLines()帮助程序方法。

当然,现在您已经了解了如何检索数据,您可以对其进行调整以以各种其他方式使用数据,例如,如果您并不真正想要或不需要表示为string对象数组的文本。

如果您使用的是资源文件并添加了文本文件,则可以使用

string text=Properties.Resources.<ResourceName>

此处 资源 是您项目的默认资源。如果添加了自定义资源文件,则可以使用其名称而不是属性.资源

如果您的内容是文件,则表示为字节。对于简单文本,如果您包含文本文件,它将是一个字符串。

对于任何其他文件,您可以使用将内容转换为文本(如果是文本)的语法作为

string text=Encoding.ASCII.GetString(Properties.Resources.<ResourceName>);

如果您的文件具有任何其他编码(如 UTF Unicode),则可以在编码下使用 UTF8 或此类类

相关内容

  • 没有找到相关文章

最新更新