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

2024-03-31

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

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

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

提前致谢


Without a good, minimal, complete代码示例 https://stackoverflow.com/help/mcve无法提供具体建议。

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

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

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

否则,该文件将作为byte[]中的属性暴露的对象Properties.Resources class.

如果您使用“嵌入式资源”构建选项而不是“资源”设计器,则您的数据将通过调用可用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;
    }
}

Using Properties.Resources:

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

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

称为像string[] allLines = ReadAllResourceLines(Properties.Resources.MyTextFile);, where 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对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用嵌入文本文件中的 File.ReadAllLines 的相关文章

随机推荐

  • MediaCodec 和 TextureView 的 Z 顺序问题

    在我的 Android 应用程序中 我需要使用以下 Z 顺序渲染三个视图 在底部 输出表面MediaCodec解码器覆盖整个屏幕 我有一个要求 我必须转换生成的图像MediaCodec 例如缩放 中间有一个GLSurfaceView 或我定
  • 如何修改 Grails 中的域类?

    我无法弄清楚在自动创建相应的数据库表后修改域类的 标准做法 是什么 Grails 中没有 迁移 而且我无法告诉它输出它将生成的新 SQL 以便您可以将其与之前的表定义进行比较并手动发出您自己的 ALTER TABLE 命令 这就是我所做的
  • R:index()或index.xts()改变了时间序列的Date值,为什么?

    我想从使用 getSymbols 获得的时间序列中提取日期 但是当我使用 index index xts 函数时 返回的日期似乎早了一天 我无法理解为什么下面的代码中会发生这种行为 然而 预期的行为是获取与原始时间序列中的日期对象相对应的日
  • 仅在处理同一主题的 SQS 订阅后调用 AWS Lambda SNS 事件

    我想实现一个 Amazon SNS 主题 它首先将消息传递到作为该主题订阅者的 SQS 队列 然后执行也是同一主题订阅者的 AWS Lambda 函数 然后 Lambda 函数可以从 SQS 队列读取消息并并行处理其中的多个消息 数百个 我
  • 使用 HTML5 Web 数据库存储文件以供离线访问

    我正在尝试为 iPad 创建一个简单的网络应用程序 需要在没有互联网连接的地方使用 该应用程序本质上是一个简单的 幻灯片 但还包含一些视频文件 通常约为 100MB 最初 我计划在上路之前使用 HTML5 的离线清单缓存将资源同步到 iPa
  • 替换 C++ 矩阵类中特定颜色的所有像素

    1 我有一个矩阵类 Mat src imread pic png 0 http i1265 photobucket com albums jj502 anizilla demo result png http i1265 photobuck
  • 是否可以制作带有 UL/LI 且无图像的滑块? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 因此 我在谷歌上寻找滑块教程 我发现了很多 但都是图像 我想知道是否可以用 ul 元素制作一个没有图像的滑块 例如 UL 的宽度为 300
  • asp.net 自定义 HttpHandler 和 URL 路由

    我想通过自定义 HttpHandler 处理对我的应用程序 http example com whateverpath 的请求 但返回的内容取决于 whateverpath 的值 因此 访问 http example com path1 的
  • 禁用所选文件的“文档注释”警告

    Xcode 能够检查文档注释问题 并在出现问题时报告警告 例如 我使用 CocoaPods 将 Facebook SDK 添加到我的项目中 在文件中的某个时刻FBError h有以下代码 typedef NS ENUM NSInteger
  • 如何使用 sqlplus 或 sql Developer 云连接连接到 Azure Oracle 12c 数据库

    我在 azure 中有 2 个虚拟机 一个是数据库服务器 另一个是 Web 服务器 我可以获得这些服务器的远程桌面连接 并且 Web 服务器可以连接到数据库 sqlplus user password internal network ip
  • jsTree通过ajax加载子节点

    下面发布的代码通过 ajax 请求加载我的树的根元素 我的树非常大 因此我无法一次加载所有项目 因此我需要通过请求子级提供特定 ID 来加载元素 如何通过点击节点通过ajax加载元素 jstree demo div jstree plugi
  • Bootstrap 3 导航下拉菜单

    我使用带有下拉菜单的导航栏 Bootstrap 3 我调整浏览器窗口的大小 我打开菜单 我调整浏览器窗口大小 gt 767px 我打开下拉菜单 在导航栏中 问题 下拉菜单中出现滚动条 见下图 我的 nav 元素是相对位置
  • Mongod 错误:98 无法锁定文件:/data/db/mongod.lock 资源暂时不可用。 mongod 实例是否已在运行?

    2017 06 12T13 06 18 407 0300 I 存储 initandlisten initAndListen 中出现异常 98 无法锁定文件 data db mongod lock 资源暂时不可用 mongod 实例是否已在运
  • 角度材质垫 - 根据最长选项宽度选择宽度

    我有一个带有选项的垫选择 我希望将其内联设置为文本 并且下拉菜单的长度与最长的选项一样长 我可能可以使用 js css vanilla 风格进行一些黑客攻击 但正在寻找更好的解决方案 有什么想法吗
  • Dart:如何创建一个空列表作为默认参数

    我有多个列表 如果没有为它们分配任何内容 则默认情况下它们需要为空 但我收到这个错误 class Example List
  • 如何覆盖 tdalign="center"?

    据收集自为什么align center 不覆盖 text align right https stackoverflow com questions 2546857 why aligncenter not overriding on tex
  • 什么是同步和异步方法?

    什么是同步方法 什么是异步方法 同步方法和异步方法有什么区别 什么时候必须使用同步或异步方法 我问这些问题是因为我不明白 public async void ReadData filepath CreateDoc hello lt Why
  • GWT Dev 模式和外部服务器出现间歇性序列化异常

    我有一个 GWT 应用程序 它在开发模式下与 GWT 的嵌入式码头服务器完美运行 但是 我需要转向使用外部码头服务器 出于各种原因 我遵循了 GWT 文档编译与调试 http www gwtproject org doc latest De
  • 致命错误:从无效上下文调用 private MyObject::__construct()

    在 PHP 中创建新对象时 我收到以下错误消息 Fatal error Call to private MyObject construct from invalid context我只是创建新对象 而不尝试显式调用构造函数 有谁知道发生了
  • 使用嵌入文本文件中的 File.ReadAllLines

    我一直在应用迄今为止在 Bob Tabors 绝对初学者系列中学到的知识 并为我女儿编写了一个小型控制台文字游戏 需要我生成一个随机的 5 个字母单词 我以前使用过File ReadAllLines path 从我的系统上的文本文件 wor