zoukankan      html  css  js  c++  java
  • 如何读取嵌入的资源

    在程序设计的期间,我们通常会用到一些辅助的文件,例如某些特定的xml架构文件,或者样式表,甚至一些简单的文本文件等等。那么我们应该如何打包这些文件呢?

    让我们来看看默认情况下是什么样子的:

    image


    我们有一个文本文件是TestFile.txt,注意观察它的生成操作是:内容。而且默认是不复制到输出目录的。也就是说,如果你编译程序,你不会在输出目录中看到它。

    image

    那么这样会有问题吗?当然会有,例如你的程序中需要使用该文件,例如你想通过如下方式打开它

    FileStream fs = new FileStream("TestFile.txt", FileMode.Open);
    显然,你需要把它复制到输出目录。那么该如何做呢?

    你一定也想到了吧?对的,你可以把那个"复制到输出目录"的属性设置为"永远复制"或者"如果较新则复制",或者你当然也可以手工地把文件复制过去。

    那么这样,是否还有问题呢?我觉得应该是有的,例如你并不想让用户知道该文件的存在,但你又想用它?

    我们知道如果不想用户知道该文件的存在,最保险的做法就是不复制过去;而如果不复制过去,那么你代码里面有如何使用它呢?真是两难的境地啊

    事情可能没有那么糟糕,我们来看看下面的做法
    1. 首先把"生成操作"设置为"嵌入的资源"
    2. 然后通过如下的方式去读取该文件

    using System;
    using System.IO;

    namespace Test
    {
        class Program
        {
            static void Main(string[] args)
            {
                string resoureeName = "Test.TestFile.txt";//这个名称是用命令空间再加上文件名组合而成
                StreamReader reader = new StreamReader(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(resoureeName));

                Console.WriteLine(reader.ReadToEnd());

                reader.Close();

                Console.Read();
            }
        }
    }

    3. 这样我们就实现了目的。难道不是吗?可以看看下面的输出
    image

    4. 我们还可以通过反编译器看到这个资源在程序集中的样子
    image 
  • 相关阅读:
    基于接口的动态代理和基于子类的动态代理
    JDBC连接数据库
    关于使用Binlog和canal来对MySQL的数据写入进行监控
    使用VMware12在CentOS7上部署docker实例
    VMWare12pro安装Centos 6.9教程
    读《Java并发编程的艺术》学习笔记(十)
    读《Java并发编程的艺术》学习笔记(九)
    读《Java并发编程的艺术》学习笔记(八)
    读《Java并发编程的艺术》学习笔记(七)
    读《Java并发编程的艺术》学习笔记(六)
  • 原文地址:https://www.cnblogs.com/chenxizhang/p/1269815.html
Copyright © 2011-2022 走看看