C#资源文件操作的总结

时间:2024.5.2

在这里,我来总结一下关于资源文件的相关操作。

//1.比较常见的有获取资源文件对应的文件流,然后转换到相对应的文件

//比较典型的做法是通过代码程序集加载指定资源

//如下通过Assembly的静态方法GetExecutingAssembly()得到程序集

//还有很多方式可以得到代码程序集

System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly();

Stream manifestResourceStream = null;

manifestResourceStream = asm.GetManifestResourceStream("MyLibrary." + filename);

return manifestResourceStream;

//得到该文件流,这里也可以是字符流。

//如果我们资源文件对应的该清单是一个图片文件

System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(manifestResourceStream, true);

//如果我们的资源文件是光标文件

Cursor cursor = new Cursor(manifestResourceStream);

//图标

Icon icon = new Icon(manifestResourceStream);

//字符串

System.IO.StreamReader sr = new System.IO.StreamReader(manifestResourceStream);

string str = sr.ReadLine();

//2.另外一种写法,主要是通过ResourceManager类的GetObject()方法

//也可以通过GetStream()得到流后执行操作.

System.Resources.ResourceManager manager =

new System.Resources.ResourceManager("资源名称", Assembly.GetExecutingAssembly());

Object target = manager.GetObject("资源文件名");//获取到指定的资源的值

//在这里对应我们加入到资源文件的清单,

//转换回我没的目标值,可能会产生一个拆箱的过程

//如果我们资源文件对应的该清单是一

System.Drawing.Bitmap bitmap = (System.Drawing.Bitmap)target;

//如果我们的资源文件是光标文件

Cursor cursor = (Cursor)target;

//图标

Icon icon = (Icon)target;

//字符串

string str = target.ToString();//或者manager

manager.GetString("资源文件名");

//通过以上两种操作,就可以从资源文件中进行一个指定资源的加载了。

//前提是你的资源清单理存在该资源哦。

//推荐使用第种方法,这种方法也是MS Resx里对资源文件的操作方法。

//现在我们已经可以读取资源文件了,现在开始写资源文件的操作。

//3.当然,你可以直接通过设计界面来添加一个资源文件,

//切记将生成操作改为“嵌入的资源”,Embed

System.Resources.ResourceWriter writer =

new System.Resources.ResourceWriter("dongpad.com.resources");

writer.AddResource("bitmap", Image.FromFile(@"dongpad.bitmap"));

个图片文件

writer.AddResource("cursor", Image.FromFile(@"dongpad.cursor"));

writer.AddResource("ico", Image.FromFile(@"dongpad.ico"));

writer.AddResource("str", Image.FromFile(@"dongpad.str"));

//在这里资源的名称记得要唯一。

writer.Generate();

writer.Close();

//下次給大家总结一下关于C#开发中常用的一些重写。希望大家支持!

--参考文献--------------------------------------------------------------------------

什么是资源文件

在 .NET 中准备 World-Ready 程序时需要三步,Globalization,Localizability 和 Localization。在这第三步的 Localization 中就是使用资源文件最常见的地方。(本文不讨论 World-Ready 程序,或许以后在另一篇文章中)因为程序的逻辑界面需要与资源界面隔离,而资源界面就是我们所说的资源文件。顾名思义,一个资源文件中当然全是资源,不过,什么是资源?这里所谓的资源就是程序中可利用的数据,譬如:字符串、图片和任何二进制数据,包括任何类型的文件。注意一个资源文件可以有多种语言版本,举例,一个 Strings.resources 文件可以有英语版、简体中文版、繁体中文版等。 ResourceManager 可以自动根据文件名来确认调用哪个版本。不同的版本只要在文件名中添入区域语言就可以了。比如,我们的 Strings.resources 是默认版,英语版的可以是 Strings.en-US.resources(美国英文),简体中文的可以是 Strings.zh-CHS.resources(简体中文),而繁体中文的就可以是 Strings.zh-CHT.resources(繁体中文)。所谓的默认版就是当找不到适当的资源版本时用的资源,一般都是英文。默认文件应当被嵌入到主 Assembly 中,这样就不会发生找不到资源的错误。在 VS.NET 中将一个文件的属性设为 Embedded Resource 可以使资源被嵌入到主 Assembly 中。

资源文件类型

System.Resources 名字空间支持三种资源文件:

.txt 文件,只能有字符串资源。因为不能被嵌入到 Assembly 中,所以很容易暴露,被客户修改。最大缺点是仅支持字符串资源,所以不推荐使用。

.resx 文件,由 XML 组成,可以加入任何资源,包括二进制。同样不能被嵌入到 Assembly 中。在 System.Resources 名字空间中有专用读写的类。VS.NET 创建这种文件然后将其转成 .resources 文件并根据设置将其嵌入到 Assembly 中。

.resources 文件,PE 格式,可以加入任何资源。唯一可以被嵌入到 Assembly 的文件,在 System.Resources 名字空间中有专用读写的类。

调用资源文件的几种方法

ResourceManager 可以根据不同的 UICulture 设置返回不同的本地资源(这与 World-Ready 程序有关,在此不讨论),我们只需知道调用资源用到它就可以了。接下来让我们看看如何调用每一种: .txt 文件:

不可以直接调用,得先将其转换成 .resources 文件才能使用。(关于如何转换请看"推荐工具") .resx 文件:

可以用 ResXResourceReader 来做读取,但是这种方法不直观,不推荐直接调用 .resx 文件。正确的方法是将其转换成 .resources 文件,然后用 ResourceManager 作读取工作。注意如果是在 VS.NET 中添加的 .resx 文件,那么它们自动被设为 Embedded Resource,转成 .resources 文件后被嵌入到 Assembly 中。

.resources 文件:

分成两种情况:

被嵌入或编译成 Satellite Assembly:

用 ResourceManager 的各种 constructor 来获得在 Assembly 中的资源。

单独文件,没被编译或嵌入到 Assembly 中:

可以用 ResourceManager.CreateFileBasedResourceManager 来获得资源集(ResourceSet),就是所有的资源。

特殊情况:

还有一种特殊情况,那就是当你直接嵌入一资源时,也就是说,不通过一个资源文件而直接将一资源嵌入到 Assembly 中。这可以在 VS.NET 中通过设置一文件的 Build 属性为 Embedded Resource 实现。在这种情况下 ResourceManager 就没有用了,因为它只能获取 .resources 资源文件(在或不在 Assembly 中)。那么如何调用这类的资源呢?不难,我们需要利用一些 Reflection 中的特征。别怕,不是让你再学 Reflection,其实我们只要了解一些 System.Reflection.Assembly 这个类中的一些函数就可以了。有三个相关函数,不过我们只需要 Assembly.GetManifestResourceStream 这个函数。这个函数将一嵌入到 Assembly 中的资源以 stream 的方式返回,而我们可以将这个 stream 转成在 .NET 中可用的对象。比如,如果嵌入资源是一图片,那么我们可以利用 New Bitmap(Stream) 这个 Bitmap 的 constructor 获得这个图片资源的 Bitmap 对象。

注:在这里仅介绍怎样获得不同的资源的方法,关于怎样用各个类与函数请参看有关文档。

如何准确的定义资源文件的逻辑位置

我想这是许多人最关注的一段了!在这里作者将解说如何正确的填写 ResouceManager(String, Assembly) 这个 constructor,还有如何正确的填写 Assembly.GetManifestResourceStream(String),因为它们两个的原理是相同的。看过了上面的描述,到了这里就简单多了。这里主要讨论的是怎么填写那个 String。这个 String 就是资源的完整名,一个完整名由它的名字空间和文件名前部分(BaseName)组成。例如,如果默认名字空间(root namespace)是 DefaultNamespace,资源文件的名字是 Strings.en-US.resources,那么它的完整名就是 DefaultNamespace.Strings。这个很简单,不过怎样确定名字空间呢?这就有些奇怪了,因为 C# 的编译器与 VB.NET 的编译器有些不同。作者在这里分别给出两个编译器怎样给嵌入资源自动添加命名空间:

C#

它自动添加 default namespace(与 root namespace 相同),但也添加子文件夹的名字。例如,在 Subfolder 子文件夹下放的资源文件 Strings.en-US.resources,它的完整名是 default namespace + subfolder + base name = DefaultNamespace.Subfolder.Strings

VB.NET

在 VB.NET 中就很简单了,它自动给嵌入资源添加 root namespace。不管你在哪个子文件夹中放置资源文件,资源文件的完整名永远是 root namespace + base name。

根据上面的描述,如果我们使用 C#,用 VS.NET 在 NewFolder 这个子文件夹中添加了一个

叫 Images.resources 的资源文件,那么我们应该用以下代码获取这些资源,假设 default namespace 是 MyDefault:

ResourceManager res = new ResourceManager("MyDefault.NewFolder.Images", this.GetTy


第二篇:C#文件操作总结


C#文件操作总结

20xx-07-03 09:48:30| 分类: C#杂七杂八 |字号大中小订阅

1.1文本文件的读写

FileStream f=new FileStream("1.txt",FileMode.Create);//创建一个1.txt

FileStream f=new FleStream("1.txt",FileMode.Open);//打开一个1.txt

//读取文件

StramReader m=new StreamReader(f);

string s="";

While(!m.EndOfStream) //判断文本文件是否到流的末尾

{

s+=m.ReadLine();

}

m.Close();

f.Close();

//写入文件

StreamWriter n=new StreamWriter(f);

string s="";

n.Write(s); //s可以为double/int /char/string类型

n.Close();

f.Close();

1.2二进制文件流读写

FileStream f=new FleStream("1.txt",FileMode.Open);//打开一个1.dat

//二进制文件读取

BinaryReader m=new BinaryReader(f);

m.ReadBoolean(); //读取bool类型值

m.ReadInt32(); //ReadInt64()/ReadString()

m.Close();

f.Close();

//写入文件

string s=""; //s可以为double/int /char/string类型

BinaryWriter n=new BinaryWriter(f);

n.Write(s);

n.Close();

f.Close();

1.3File类的文件操作及文件信息获取

bool s=File.Exists("1.txt"); //判断文件是否存在bool

File.Move(path1,path2); //将文件从path1移动到path2

File.Copy(path1,path2); //将文件从path1拷贝到path2

File .Delete("1.txt");//删除文件

DateTime d= File.GetCreationTime ("1.txt");//获取文件创建时间

DateTime d=File .GetLastAccessTime ("1.txt");//获取上次访问文件的日期和时间

DateTime d=File .GetLastWriteTime ("1.txt");//获取上次修改文件的日期和时间

//修改时间

DateTime d=DateTime .Now ;

File .SetCreationTime ("1.txt",d);//设置文件创建时间

File .SetLastAccessTime ("1.txt",d);//设置文件上次修改时间

File .SetLastWriteTime ("1.txt",d);//设置文件上次写入时间

1.4FileInfo 类的文件操作

FileInfo类的文件操作

FileInfo类提供的许多方法类似于File类的方法,但是File类是静态类,这是不同之处。FileInfo aFile = new FileInfo("1.txt");

if (aFile.Exists) //判断文件是否存在

{

Console.WriteLine("File Exist!");

}

string s = aFile.FullName;//获得文件完整路径

string s = aFile.Name;//获得文件完整路径

string s = aFile.Extension;//获得文件扩展名

string s = aFile.DirectoryName;//获得文件目录的路径

int len = aFile.Length;//获得文件的容量

bool s = aFile.IsReadOnly;//判断文件是否只读

DateTime d = aFile.LastAccessTime;//获得文件最后访问时间

DateTime d = aFile.LastWriteTime;//获得文件最后写入时间

1.5 Directory类文件操作

Directory类也是静态类,主要函数如下操作:

string s = "D://FileDocument";

string src="D://3";

string dst="D://FileDocument//";

Directory.CreateDirectory(s);//在D盘创建文件夹FileDocument

Directory.Delete(s);//删除D盘FileDocument文件夹,该文件夹必须可写或为空

string[] num = Directory.GetDirectories(s);//返回D盘FileDocument 文件夹内所有文件夹的路径数组string[],即目录名数组

string[] nm = Directory.GetFiles(s);//返回D盘FileDocument文件夹内所有文件的路径数组string[],不包括文件夹目录

string[] numS = Directory.GetFileSystemEntries(s);//返回D盘FileDocument文件夹内所有文件及目录的路径数组string[]

Directory.Move(src, dst);//把D盘文件3重命名为D盘文件FileDocument,该文件之前不可存在,执行该命令时重建

注意:DirectoryInfo类作用类似于FileInfo类,是一个实例化的对象

1.5FileStream读取文件操作

FileStream可以读取任何文件,包括声音和视频文件,但是只能处理原始字节,即,只能把文件内容保存在一个byte[]数组中,不过我们可以通过几种转换类可以很容易的将字节数组转换为字符数组,或将字符数组转换为字节数组。

byte[] byData = new byte[100];

char[] charData = new char[100];

FileStream aFile=new FileStream ("1.dat",FileMode .Open );

aFile.Seek(100, SeekOrigin.Begin);//从文件开头开始,将文件指针偏移100个字节

aFile.Read(byData, 0, 100);//从当前指针位置,读取100个字节到byData数组中

Decoder d = Encoding.UTF8.GetDecoder();

d.GetChars(byData, 0, byData.Length, charData, 0);//在byData中索引为0的位置开始,读取byData长度的字节数到字节数组charData中,位置是从charData的0索引位置开始

byData = Encoding.UTF8.GetBytes(charData);//将字符数组转换为字节数组

aFile .Seek (0, SeekOrigin.Begin );//把指针位置偏移到文件开头

aFile.Write(byData, 0, byData.Length);//把byData数组内容写入文件中,开始位置为0索引处

更多相关推荐:
作文总结

20xx---20xx学年第二学期三年级作文总结赵瑞霞三年级的作文教学既是低年级看图说话、写话的延续,又是高年级作文训练的准备。三年级作为作文教学承上启下的入门阶段显得尤为重要,以下几点是我在三年级新课程作文教…

作文总结

张威同学乖巧机灵学习作文很认真课堂上也能积极主动发言给自己创造锻炼的空间作文写作能从开始入学时的二三百字到结课时的六七百字进步不小和众多初学作文的孩子一样张威同学最大的问题也是作文的口语化严重叙述像记流水账人物...

作文总结

七年级至九年级语文和汉语作文检查小结利用一天的时间对七至九年级的语文和汉语作文进行了检查检查的项目有是否跟上进度及批改本数从检查情况看教师基本上能按作文批改的要求进行认真批改多数教师批改的教细有肯定的表扬有指导...

作文竞赛总结

本次作文竞赛在各级领导组织安排和各位语文老师的积极努力下,比赛已经圆满结束。为了促进今后的作文教学的提高,特总结如下:本次作文比赛参与面广,组织有序。共有四个年级250名学生参加。经过一周的比赛和评阅,评选出部…

考试总结作文

考试总结作文考试总结作文一期中考试结束了这次考试虽然比中考有些进步但离我想考的成绩还相差甚远我认真分析了原因在考试前我并没有深入复习只不过是看了看书临阵磨枪突击生物跟地理平时不善于积累复习没有重点主要拉分的是地...

作文教学工作总结工作总结

时光荏苒,岁月如梭。半学期紧张而又忙碌的教学工作即将结束,回想本学期在作文教学方面的工作,既有点滴收获,又存在许多不足,下面总结一、平时的作文教学,求稳求实。在平时的作文教学中,我严格按照课标的要求,训练每一个…

学习总结作文

学习总结作文学习总结作文一现在我心里感到一种前所未有的迷茫整个一学期整个初中生活的六分之一就这么匆匆过去了而我的收获又是怎样的刚开学时的喜悦渐渐消失而更多的是无穷的烦恼与忙碌但是学习不是一个苦恼的过程而是苦乐交...

初中部现场作文比赛总结

燕岭初中部现场作文比赛总结为培养学生的写作兴趣,切实提升学生的语文综合素养,为学生提供展示自我的舞台;丰富学生的校园生活;展现教师作文教学的成果。我校初中部进行了一次现场作文比赛活动,各班推选了三名学生参加活动…

作文教学研修总结

作文教学研修总结很荣幸参加了江西教师网展开的培训,感觉真是受益匪浅。从徐老师讲作文中,我更进一步了解了中学语文习作教学的发展方向和目标,反思了自己教学工作中的不足。作为语文教师,不是只懂一些语文理论知识就行,我…

雅思大作文写作模板总结

讨论类开头:Itisalwaysahottopicthat加题目改写(至少三个地方)Inmyperspective,()isanadvantage/adramaticallysignificantaspect.…

作文课题阶段总结

吉林省基础教育校本科研“十二五”规划课题《小学高年段综合训练作文教材的校本开发研究》课题阶段研究总结(20xx.3—20xx.7)安图县第二实验小学课题组时间来去匆匆,一晃又是一个学期。课题“小学高年段综合训练…

英语作文句式总结

英语作文句式总结一开头Recentlytheproblemofhasarousedpeoplesconcern最近问题已引起人们的关注Internethasbeenplayinganincreasinglyim...

总结的作文(39篇)