如何读取嵌入的资源

该篇文章是我于2009年6月10日通过自己编写的工具,批量从位于在博客园的博客站点(http://chenxizhang.cnblogs.com)同步而来。文章中的图片地址仍然是链接到博客园的。特此说明!

陈希章

原文地址:http://www.cnblogs.com/chenxizhang/archive/2008/08/17/1269815.html
原文标题:如何读取嵌入的资源
原文发表:2008/8/17 8:09:00

在程序设计的期间,我们通常会用到一些辅助的文件,例如某些特定的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 
作者:陈希章
出处:http://blog.youkuaiyun.com/chen_xizhang
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值