.NET(C#) 读取Resource资源文件的方法

内容纲要

简介:

System.Resources 名字空间支持三种资源文件:.txt 文件,只能有字符串资源。不能被嵌入到 Assembly 中,则很容易暴露,被客户修改。最大缺点是仅支持字符串资源,不推荐使用。.resx 文件由 XML 组成,可以加入任何资源,包括二进制。同样不能被嵌入到 Assembly 中。在 System.Resources 名字空间中有专用读写的类。 .NET(C#) 创建这种文件然后将其转成 .resources 文件并根据设置将其嵌入到 Assembly 中。.resources 文件,PE 格式,可以加入任何资源。唯一可以被嵌入到 Assembly 的文件,在 System.Resources 名字空间中有专用读写的类。

1、嵌入的资源(Embedded Resource)

在VS(Microsoft Visual Studio)中将文件的生成操作设置 "嵌入的资源" 的读取方法,代码如下:

using (Stream stream = Assembly.GetExecutingAs().GetManifestResourceStream("PDF2PPT.Aspose.Total.lic"))
{
    string content = new StreamReader(stream).ReadToEnd();
}

2、资源(Resource)

在VS(Microsoft Visual Studio)中将文件的生成操作设置 "Resource" 的读取方法,代码如下:

Stream stream = null;
ResourceManager rm = new ResourceManager("PDF2PPT.g",typeof(Form1).Assembly);
ResourceSet rs = rm.GetResourceSet(new System.Globalization.CultureInfo("en"), true, true);
foreach (DictionaryEntry item in rs)
{
    if (item.Key.ToString() == fullname)
        stream = item.Value as Stream;
}
using (stream)
{
    string content = new StreamReader(stream).ReadToEnd();
}

3、.Resx资源文件

直接添加文件到.Resx资源文件中,在运行时使用Resource Manager读取,代码如下:

1)读取内容

string sTemplate = string.Empty;
Assembly assembly = Assembly.GetExecutingAssembly();
string resourceName = assembly.GetName().Name.ToString() + ".Resources.PageTemplate.html";
using (Stream stream = assembly.GetManifestResourceStream(resourceName))
{
   using (StreamReader sr = new StreamReader(stream))
   {
      sTemplate = sr.ReadToEnd();
   }
}

2)复制文件

string sDb = AppDomain.CurrentDomain.BaseDirectory + "rec.db";
if (!File.Exists(sDb))
{
    Assembly assembly = Assembly.GetExecutingAssembly();
    string resourceName = assembly.GetName().Name.ToString() + ".Resources.rec.db";
    using (Stream stream = assembly.GetManifestResourceStream(resourceName))
    {
        byte[] buffer = new byte[stream.Length];
        stream.Read(buffer, 0, buffer.Length);
        stream.Seek(0, SeekOrigin.Begin);
        using (FileStream fs = new FileStream(sDb, FileMode.Create))
            fs.Write(buffer, 0, buffer.Length);
    }
    Console.WriteLine($"db文件:{sDb},不存在,已自动复制");
}

3)获取资源中的图像文件

Properties.Resources res = new Properties.Resources();
PropertyInfo[] properInfo = res.GetType().GetProperties(BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Instance);
foreach (PropertyInfo item in properInfo)
{
    // 获取指定文件名格式的图片
    if (item.Name.Contains("img_"))
    {
        Bitmap b = (Bitmap)Resources.ResourceManager.GetObject(item.Name, Properties.Resources.Culture);
        using (MemoryStream stream = new MemoryStream())
        {
            b.Save(stream, ImageFormat.Jpeg);
            byte[] data = new byte[stream.Length];
            stream.Seek(0, SeekOrigin.Begin);
            stream.Read(data, 0, Convert.ToInt32(stream.Length));
            // do someting..
        }
    }
}

4)获取资源中的字符串

string sVal = Resources.ResourceManager.GetObject(item.Name);

给TA打赏
共{{data.count}}人
人已打赏
C#

C# 面向对象——封装

2022-10-27 11:06:32

C#

C# File文件处理——删除文件

2022-10-28 12:45:09

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
今日签到
有新私信 私信列表
搜索