在.NET程序中使用两种资源文件,一种是.resources文件,另一种是 .resx文件,就是我们在用窗体设计器创建一个窗体后自动添加的资源文件.两中文件都用于存储程序中使用的各种资源.微软在IDE中为我们提供了两种资源文件的的编辑器.
如果我们在自己的程序中需要存储自己资源用于实现程序外观面板或皮肤的交互设置,或轻松的实现程序的多语言版本.使用资源文件是一个很好的选择.
在.NET 的 System.Resource 命名空间中提供了两个类 ResourceReader 类和 ResXResourceReader类,使用这两个类我们可以在程序中读取资源文件中保存的的资源,同样使用 ResourceWriter类和 ResXResourceWriter类我们可以把自己的资源保存到资源文件中.
首先我们实现从资源文件中读取资源,为了使用资源先定义一个描述资源的类
现在我们就可以使用ResourceReader 类和 ResXResourceReader类从资源文件中读取资源项了,从两个类的名字我们可以看出 ResXResourceReader 类用于读取 .resx 类型的资源
下面的代码演示了怎么从资源文件中读取资源项
现在我们已经可以把资源文件中的资源项读出来,代码十分的简单,以后会继续实现资源的保存和管理
如果我们在自己的程序中需要存储自己资源用于实现程序外观面板或皮肤的交互设置,或轻松的实现程序的多语言版本.使用资源文件是一个很好的选择.
在.NET 的 System.Resource 命名空间中提供了两个类 ResourceReader 类和 ResXResourceReader类,使用这两个类我们可以在程序中读取资源文件中保存的的资源,同样使用 ResourceWriter类和 ResXResourceWriter类我们可以把自己的资源保存到资源文件中.
首先我们实现从资源文件中读取资源,为了使用资源先定义一个描述资源的类
/// <summary>
/// 资源项类
/// </summary>
public class ResourceItem
{
/// <summary>
/// 资源名称
/// </summary>
private string _strResourceName;
/// <summary>
/// 资源值
/// </summary>
private object _objResourceValue;
/// <summary>
/// 初始化 ResourceItem 类的新实例
/// </summary>
/// <param name="name">资源名称</param>
/// <param name="resourceValue">资源值</param>
public ResourceItem(string name, object resourceValue)
{
this._strResourceName = name;
this._objResourceValue = resourceValue;
}
公开方法和属性
}
定义一个枚举描述资源的类型
/// 资源项类
/// </summary>
public class ResourceItem
{
/// <summary>
/// 资源名称
/// </summary>
private string _strResourceName;
/// <summary>
/// 资源值
/// </summary>
private object _objResourceValue;
/// <summary>
/// 初始化 ResourceItem 类的新实例
/// </summary>
/// <param name="name">资源名称</param>
/// <param name="resourceValue">资源值</param>
public ResourceItem(string name, object resourceValue)
{
this._strResourceName = name;
this._objResourceValue = resourceValue;
}
公开方法和属性
}
/// <summary>
/// 资源项类型
/// </summary>
public enum ResourceItemType
{
/// <summary>
/// 字符串
/// </summary>
String = 0,
/// <summary>
/// 图片
/// </summary>
Bitmap = 1,
/// <summary>
/// 图标
/// </summary>
Icon = 2,
/// <summary>
/// 光标
/// </summary>
Cursor = 3,
/// <summary>
/// 未知
/// </summary>
Unknow = 5
}
/// 资源项类型
/// </summary>
public enum ResourceItemType
{
/// <summary>
/// 字符串
/// </summary>
String = 0,
/// <summary>
/// 图片
/// </summary>
Bitmap = 1,
/// <summary>
/// 图标
/// </summary>
Icon = 2,
/// <summary>
/// 光标
/// </summary>
Cursor = 3,
/// <summary>
/// 未知
/// </summary>
Unknow = 5
}
现在我们就可以使用ResourceReader 类和 ResXResourceReader类从资源文件中读取资源项了,从两个类的名字我们可以看出 ResXResourceReader 类用于读取 .resx 类型的资源
下面的代码演示了怎么从资源文件中读取资源项
public class ResourceManage
{
/// <summary>
/// 资源存放字典
/// </summary>
private Dictionary<string, ResourceItem> _resources = new Dictionary<string, ResourceItem>();
/// <summary>
/// 载入文件
/// </summary>
/// <param name="fileName"></param>
public void LoadFile(string fileName)
{
/// 判断资源文件的扩展名
switch (Path.GetExtension(fileName).ToLowerInvariant())
{
case ".resx":
ResXResourceReader rx = null;
try
{
rx = new ResXResourceReader(fileName);
rx.BasePath = Path.GetDirectoryName(fileName);
IDictionaryEnumerator n = rx.GetEnumerator();
while (n.MoveNext())
if (!this._resources.ContainsKey(n.Key.ToString()))
this._resources.Add(n.Key.ToString(),
new ResourceItem(n.Key.ToString(), n.Value));
}
catch { }
finally
{
if (rx != null)
{
rx.Close();
}
}
break;
case ".resources":
ResourceReader rr = null;
try
{
rr = new ResourceReader(fileName);
foreach (DictionaryEntry entry in rr)
{
if (!this._resources.ContainsKey(entry.Key.ToString()))
this._resources.Add(entry.Key.ToString(),
new ResourceItem(entry.Key.ToString(), entry.Value));
}
}
catch { }
finally
{
if (rr != null)
{
rr.Close();
}
}
break;
}
}
}
{
/// <summary>
/// 资源存放字典
/// </summary>
private Dictionary<string, ResourceItem> _resources = new Dictionary<string, ResourceItem>();
/// <summary>
/// 载入文件
/// </summary>
/// <param name="fileName"></param>
public void LoadFile(string fileName)
{
/// 判断资源文件的扩展名
switch (Path.GetExtension(fileName).ToLowerInvariant())
{
case ".resx":
ResXResourceReader rx = null;
try
{
rx = new ResXResourceReader(fileName);
rx.BasePath = Path.GetDirectoryName(fileName);
IDictionaryEnumerator n = rx.GetEnumerator();
while (n.MoveNext())
if (!this._resources.ContainsKey(n.Key.ToString()))
this._resources.Add(n.Key.ToString(),
new ResourceItem(n.Key.ToString(), n.Value));
}
catch { }
finally
{
if (rx != null)
{
rx.Close();
}
}
break;
case ".resources":
ResourceReader rr = null;
try
{
rr = new ResourceReader(fileName);
foreach (DictionaryEntry entry in rr)
{
if (!this._resources.ContainsKey(entry.Key.ToString()))
this._resources.Add(entry.Key.ToString(),
new ResourceItem(entry.Key.ToString(), entry.Value));
}
}
catch { }
finally
{
if (rr != null)
{
rr.Close();
}
}
break;
}
}
}
现在我们已经可以把资源文件中的资源项读出来,代码十分的简单,以后会继续实现资源的保存和管理