文件操作及序列化

上传人:无*** 文档编号:201340680 上传时间:2023-04-19 格式:PPT 页数:32 大小:350.50KB
收藏 版权申诉 举报 下载
文件操作及序列化_第1页
第1页 / 共32页
文件操作及序列化_第2页
第2页 / 共32页
文件操作及序列化_第3页
第3页 / 共32页
资源描述:

《文件操作及序列化》由会员分享,可在线阅读,更多相关《文件操作及序列化(32页珍藏版)》请在装配图网上搜索。

1、高级软件人才实作培训专家.Net基础加强IO操作及序列化讲师:王绚文高级软件人才实作培训专家广州传智播客 Http:/主讲:王绚文WinForml桌面程序lWinForm的控件TextBox、Timer、CheckBox、TreeView、GroupBox、Label、Button、RadioButton、CheckBoxList、RadioButtonList、Form、PictureBox、ComboBox(下拉框)、Panel、。lWinForm程序是事件驱动的l课后练习:制作一个计算器,默认为“请选择”高级软件人才实作培训专家广州传智播客 Http:/主讲:王绚文文件操作常用相关类lF

2、ile/操作文件,静态类,对文件整体操作。拷贝、删除、剪切等。lDirectory/操作目录(文件夹),静态类。lDirectoryInfo/文件夹的一个“类”,用来描述一个文件夹对象lFileInfo/文件类,用来描述一个文件对象lPath/对文件或目录的路径进行操作(很方便)【字符串】lStream/文件流,抽象类。FileStream/文件流,MemoryStream(内存流),NetworkStream(网络流)StreamReader/快速读取文本文件StreamWriter/快速写入文本文件高级软件人才实作培训专家广州传智播客 Http:/主讲:王绚文Path类(对字符串操作 st

3、atic)l目录和文件操作的命名控件System.IOlstring ChangeExtension(string path,string extension)(*)修改文件的后缀,“修改”支持字符串层面的,没有真的给文件改名string s=Path.ChangeExtension(C:tempF3.png,jpg)lstring Combine(string path1,string path2)将两个路径合成一个路径,比用+好,可以方便解决不加斜线的问题,自动处理路径分隔符的问题string s=Path.Combine(c:temp,a.jpg)lstring GetDirectory

4、Name(string path)(*)得到文件的路径名。Path.GetDirectoryName(c:tempa.jpg)lstring GetExtension(string path)得到文件的扩展名lstring GetFileName(string path)得到文件路径的文件名部分lstring GetFileNameWithoutExtension(string path)得到去除扩展名的文件名lstring GetFullPath(string path)得到文件的全路径。可以根据相对路径获得绝对路径。lstring GetTempFileName()得到一个唯一的临时文件名

5、(*)lstring GetTempPath()得到临时文件夹的路径(*)高级软件人才实作培训专家广州传智播客 Http:/主讲:王绚文操作目录l资料管理器l为了实现目录树,所以要掌握读取目录的类lDirectory和DirectoryInfovoid Delete(string path,bool recursive)删除目录,recursive表示是否递归删除,如果recursive为false则只能删除空目录bool Exists(string path)判断目录是否存在move()CreateDirectory()string GetDirectories(string path)得到

6、一个目录下的子目录string GetDirectories(string path,string searchPattern,SearchOption searchOption)通配符查找目录下的子目录,可以搜索到隐藏文件。static string GetFiles(string path)得到一个目录下的文件string GetFiles(string path,string searchPattern,SearchOption searchOption)通配符查找目录下的文件DirectoryInfo GetParent(string path)得到目录的父目录高级软件人才实作培训专家

7、广州传智播客 Http:/主讲:王绚文知识补充1(*)lPath.Combine(path1,path2),见MSDN如果指定的路径之一是零长度字符串,则该方法返回其他路径。如果 path2 包含绝对路径,则该方法返回 path2。如果path1不是以分隔符结束,并且不是c:或d:等(驱动器引用),则在串联前为path1增加分隔符。分隔符:(与操作系统平台有关)Path.DirectorySeparatorCharPath.PathSeparator;Path.VolumeSeparatorChar:lPath.GetFileName()获取文件名当目录为c:windowstest时,可获取最

8、后一个目录名,但当目录路径为c:windowstest 时,不可以。reflector查看高级软件人才实作培训专家广州传智播客 Http:/主讲:王绚文知识补充2(*)l获取当前exe文件执行的路径:Assembly.GetExecutingAssembly().Location;l不要用:Directory.GetCurrentDirectory();获取应用程序的当前工作目录。因为这个可能会变,通过使用OpenFileDialog或者手动设置Directory.SetCurrentDirectory()l做WinForm程序时会常用到。l完善昨天的“文件管理器”,双击目录节点时会报错。怎么

9、判断当前双击的是文件节点?Tag是否为null高级软件人才实作培训专家广州传智播客 Http:/主讲:王绚文资料管理器l通过treeview显示两级目录l动态添加treeview节点。di.GetDirectories()获取所有的根文件夹TreeNode tn=new TreeNode();tn.Text=d.Name;tn.Tag=d.FullName;treeView1.Nodes.Add(tn);l遍历根文件夹的同时添加二级节点,三级节点上添加文件的名儿l双击文本节点(怎么判断是否是文本节点?)在文本框中显示资料的内容l递归的方式 显示无限极节点高级软件人才实作培训专家广州传智播客 H

10、ttp:/主讲:王绚文操作文件l文本文件编码,文本文件有不同的存储方式,将字符串以什么样的形式保存为二进制,这个就是编码,UTF-8、ASCII、Unicode等,如果出现乱码一般就是编码的问题,文本文件相关的函数一般都有一个Encoding类型的参数,取得编码的方式:Encoding.Default、Encoding.UTF8、Encoding.GetEncoding(GBK)l输出Encoding.GetEncodings(),所有编码。l什么是文本文件。拖到记事本中还能看得懂的就是文本文件,doc不是。lFile类的常用静态方法:(FileInfo*)void AppendAllText

11、(string path,string contents),将文本contents附加到文件path中(如果文件不存在,则创建)bool Exists(string path)判断文件path是否存在string ReadAllLines(string path)读取文本文件到字符串数组中string ReadAllText(string path)读取文本文件到字符串中void WriteAllText(string path,string contents)将文本contents保存到文件path中,会覆盖旧内容。WriteAllLines(string path,string conte

12、nts),将字符串数组逐行保存到文件path中,会覆盖旧内容。高级软件人才实作培训专家广州传智播客 Http:/主讲:王绚文File类的方法1lFile.Copy(“source”,“targetFileName”,true);/文件拷贝,true表示当文件存在时“覆盖”,如果不加true,则文件存在报异常。lFile.Exists();/判断文件是否存在lFile.Move(“source”,“target”);/移动(剪切),思考如何为文件重命名?lFile.Delete(“path”);/删除。如果文件不存在?不存在,不报错lFile.Create(“path”);/创建文件高级软件人才

13、实作培训专家广州传智播客 Http:/主讲:王绚文File类的方法2:操作文本文件lFile.ReadAllLines(“path”,Encoding.Default);/读取所有行,返回stringlFile.ReadAllText(“path”,Encoding.Default);/读取所有文本返回stringlFile.ReadAllBytes(“path”);/读取文件,返回bytel=lFile.WriteAllLines(“path”,new string4,Encoding.Default);/将string数组按行写入文件。lFile.WriteAllText(“path”,“

14、string”);/将字符串全部写入文件lFile.WriteAllBytes(“path”,new byte5);/将byte全部写入到文件lFile.AppendAllText()/将string追加到文件高级软件人才实作培训专家广州传智播客 Http:/主讲:王绚文File类的方法3:快速得到文件流lFile.Open();/返回FileStream lFile.OpenRead();/返回只读的FileStreamlFile.OpenWrite();/返回只写的FileStream高级软件人才实作培训专家广州传智播客 Http:/主讲:王绚文l文件流?l两个大水缸,把一个缸中的水倒入另

15、一个水缸中。两种方式:直接把一个缸中的水倒入另一个缸中用个桶来把一个缸中的水舀到另一个缸中。高级软件人才实作培训专家广州传智播客 Http:/主讲:王绚文文件流l拷贝文件的两种方式:将源文件内容全部读到内存中,再写到目标文件中;读取源文件的1KB内存,写到目标文件中,再读取源文件的1KB内存,再写到目标文件中。第二种方式就是一种流的操作。l用File.ReadAllText、File.WriteAllText进行文件读写是一次性读、写,如果文件非常大会占内存、慢。需要读一行处理一行的机制,这就是流(Stream)。Stream会只读取要求的位置、长度的内容。lStream不会将所有内容一次性读

16、取到内存中,有一个指针,指针指到哪个字节就从哪个字节开始读、写。l流有很多种类,文件流是其中一种。FileStream类new FileStream(“c:/a.txt”,filemode,fileaccess)后两个参数可选值及含义自己看。FileStream可读可写。可以使用File.OpenRead、File.OpenWrite这两个简化调用方法。lbyte是任何数据的最根本表示形式,任何数据最终都是二进制。lFileStream的Position属性为当前文件指针位置,每写一次就要移动一下Position以备下次写到后面的位置。Write用于向当前位置写入若干字节,Read用户读取若干

17、字节。(*)l使用using可以方便的释放资源(自动调用Dispose方法)l只有实现了IDispose接口的类才能使用using释放资源高级软件人才实作培训专家广州传智播客 Http:/主讲:王绚文l使用FileStream写入文本文件。演示通过FileStream写入读取文本文件。对于中文如果每次读取1个byte会有什么效果?更好的选择StreamReaderl使用FileStream读取文本文件。l使用FileStream进行大文件拷贝。演示File.ReadAllBytes()与File.WriteAllBytes()进行文件拷贝。(查看内存使用情况)高级软件人才实作培训专家广州传智播

18、客 Http:/主讲:王绚文练习l练习:文件加密(每一位用255-r)。加密就是解密,解密就是加密。(帮助理解文件流而已)lbyte是任何数据的最根本表示形式,任何数据最终都是二进制。l使用using来简化操作。/总结:不是任何类型的对象都可以写在using()的小括号里面的/只有实现了IDisposable接口的类型的对象,才能写在using的小括号里面/当using执行完毕时,会自动调用对象的Dispose()方法来释放资源。l大文件拷贝。lFileStream的Position属性为当前文件指针位置,每写一次就要移动一下Position以备下次写到后面的位置。Write用于向当前位置写入

19、若干字节,Read用户读取若干字节。(*)lUtf-8:前3个字节(*)lUnicode(utf-16):前两个字节。(*)lFileStream的参数介绍。与快速创建文件流。高级软件人才实作培训专家广州传智播客 Http:/主讲:王绚文StreamWriter(读取文本文件)lStream把所有内容当成二进制来看待,如果是文本内容,则需要程序员来处理文本和二进制之间的转换。l用StreamWriter可以简化文本类型的Stream的处理lStreamWriter是辅助Stream进行处理的 using(StreamWriter writer=new StreamWriter(stream,e

20、ncoding)writer.WriteLine(你好);高级软件人才实作培训专家广州传智播客 Http:/主讲:王绚文StreamReader和StreamWriter类似,StreamReader简化了文本类型的流的读取。Stream stream=File.OpenRead(c:/1.txt);using(StreamReader reader=new StreamReader(stream,encoding)/Console.WriteLine(reader.ReadToEnd();Console.WriteLine(reader.ReadLine();ReadToEnd用于从当前位置

21、一直读到最后,内容大的话会占内存;每次调用都往下走,不能无意中调用了两次 ReadLine读取一行,如果到了末尾,则返回null。高级软件人才实作培训专家广州传智播客 Http:/主讲:王绚文练习l案例:对职工工资文件处理,所有人的工资加倍然后输出到新文件。l文件案例:马大哈|3000宋江|8000l提示:先获得FileStreamFile.OpenRead(path);File.OpenWrite(path);再用FileStream构建一个StreamReader与StreamWriter高级软件人才实作培训专家广州传智播客 Http:/主讲:王绚文对象序列化l对象序列化是将对象(比如Pe

22、rson对象)转换为二进制数据,反序列化是将二进制数据还原为对象。对象是稍纵即逝的,不仅程序重启、操作系统重启会造成对象的消失,就是退出函数范围等都可能造成对象的消失,序列化/反序列化就是为了保持对象的持久化。就像用DV录像(序列化)和用播放器播放(反序列化)一样。lBinaryFormatter类有两个方法:void Serialize(Stream stream,object graph)对象graph序列化到stream中object Deserialize(Stream stream)将对象从stream中反序列化,返回值为反序列化得到的对象l练习:将几个int、字符串添加到Array

23、List中,然后序列化到文件中,再反序列化回来l不是所有对象都能序列化,只有可序列化的对象才能序列化,在类声明上添加Serializable,对象的属性、字段的类型也必须可序列化高级软件人才实作培训专家广州传智播客 Http:/主讲:王绚文l/关于二进制序列化需要注意的事项:l1.要序列化的类型必须标记为:Serializablel2.该类型的父类也必须标记为:Serializablel3.该类型中的所有成员的类型也必须标记为:Serializablel4.序列化只会对类中的字段序列化。(只能序列化一些状态信息。)高级软件人才实作培训专家广州传智播客 Http:/主讲:王绚文序列化的步骤l1.

24、创建一个二进制序列化器:BinaryFormatter bf=.;l1.5:创建一个文件流。l2.bf.Serialize(stream,对象);高级软件人才实作培训专家广州传智播客 Http:/主讲:王绚文反序列化的步骤l1.创建一个二进制序列化器:BinaryFormatter bf;l2.创建文件流:l3.执行反序列化:object obj=bf.Deserialize(stream);高级软件人才实作培训专家广州传智播客 Http:/主讲:王绚文为什么要用多线程l让计算机同时做多件事情,节约时间。l多线程可以让一个程序“同时”处理多个事情。l后台运行程序,提高程序的运行效率,也不会使主

25、界面出现无响应的情况。Demo1:单线程带来的问题单线程带来的问题高级软件人才实作培训专家广州传智播客 Http:/主讲:王绚文.net中如何实现多线程2l产生一个线程的4步骤:编写产生线程所要执行的方法引用System.Threading命名空间实例化Thread类,并传入一个指向线程所要运行方法的委托。(这时候这个线程已经产生,但是还没有运行)调用Thread实例的Start方法,标记该线程可以被CPU执行了,但具体执行时间由CPU决定。Demo2:两个线程同时运行(画图)高级软件人才实作培训专家广州传智播客 Http:/主讲:王绚文.net中如何实现多线程1l线程肯定也是要执行一段代码的

26、。所以要产生一个线程,必须先为该线程写一个方法,这个方法中的代码就是该线程运行所要执行的代码。(找个人来做一件事情)l线程启动时,通过委托调用该方法。(委托的好处)(线程启动时,调用传过来的委托,委托就会执行相应的方法,实现线程执行方法)高级软件人才实作培训专家广州传智播客 Http:/主讲:王绚文程序 1 程序 2线程 1线程 2线程 3线程 1线程 2线程 3进程与线程l一个进程至少有一个线程 l同一个进程中的多个线程之间可以并发执行 高级软件人才实作培训专家广州传智播客 Http:/主讲:王绚文高级软件人才实作培训专家广州传智播客 Http:/主讲:王绚文前台线程和后台线程l前台线程:只

27、有所有的前台线程都关闭才能完成程序关闭。l后台线程:只要所有的前台线程结束,后台线程自动结束。高级软件人才实作培训专家广州传智播客 Http:/主讲:王绚文Thread类的一些重要成员(*)lStart()启动线程lAbort()终止线程lThread.Sleep(100)静态方法,可以使当前线程停止一段时间运行lName线程名lThread.CurrentThread()获得当前的线程引用高级软件人才实作培训专家广州传智播客 Http:/主讲:王绚文补充和练习lDemo3:线程中如何访问控件lDemo4:执行带参数的方法高级软件人才实作培训专家广州传智播客 Http:/主讲:王绚文线程的调度方式*1.非抢占式调度:指某个线程在运行时不会被操作系统强制暂停,它可以持续地运行直至运行告一段落井主动地交出运行权。在这样的调度模式之下,线程的运行就完全是单队列的,并且可能产生恶意程序长期霸占运行权的情况。而且一旦一个程序死了,那么整个电脑就只好重启啦!2.抢占式调度:指每个线程都只有极少的运行时间(在Windows内核模式下这个时间不会超过20ms),而当时间用完时该线程就会被强制暂停,保存上下文并把CPU运行权利交给下一个线程,这样调度的结果就是所有的线程都在被快速地切换运行,使得使用者感觉所有的线程在并行运行。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!