gpt4 book ai didi

c# - 使用嵌入文本文件中的 File.ReadAllLines

转载 作者:行者123 更新时间:2023-12-01 22:41:13 29 4
gpt4 key购买 nike

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

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

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

提前致谢

最佳答案

没有a good, minimal, complete code example无法提供具体建议。

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

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

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

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

如果您使用“嵌入式资源”构建选项而不是“资源”设计器,则可以通过调用 Assembly.GetManifestResourceStream(string) 方法获取数据,该方法返回 Stream 对象。可以将其包装在 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 是您在设计器中添加的资源的属性名称(即您在第二个示例中传递的字符串是文件本身的文本,而不是资源的名称)。

如果您添加了 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 对象。

关于c# - 使用嵌入文本文件中的 File.ReadAllLines,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29910061/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com