,高级软件人才实作培训专家,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,北京传智播客教育,高级软件人才实作培训专家,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,高级软件人才实作培训专家,广州传智播客,主讲:王绚文,.Net,基础加强,IO,操作及序列化,讲师:王绚文,WinForm,桌面程序,WinForm,的控件,TextBox,、,Timer,、,CheckBox,、,TreeView,、,GroupBox,、,Label,、,Button,、,RadioButton,、,CheckBoxList,、,RadioButtonList,、,Form,、,PictureBox,、,ComboBox,(下拉框)、,Panel,、。,WinForm,程序是事件驱动的,课后练习:制作一个计算器,默认为“请选择”,文件操作常用相关类,File,/,操作文件,静态类,对文件整体操作。拷贝、删除、剪切等。,Directory,/,操作目录(文件夹),静态类。,DirectoryInfo/,文件夹的一个“类”,用来描述一个文件夹对象,FileInfo/,文件类,用来描述一个文件对象,Path,/,对文件或目录的路径进行操作(很方便),【,字符串,】,Stream/,文件流,抽象类。,FileStream,/,文件流,MemoryStream(,内存流,),NetworkStream(,网络流,),StreamReader,/,快速读取文本文件,StreamWriter,/,快速写入文本文件,Path,类(对字符串操作,static,),目录和文件操作的命名控件,System.IO,string,ChangeExtension,(string path,string extension)(*),修改文件的后缀,“修改”支持字符串层面的,没有真的给文件改名,string s=Path.ChangeExtension(C:tempF3.png,jpg),string,Combine,(string path1,string path2),将两个路径合成一个路径,比用,+,好,可以方便解决不加斜线的问题,自动处理路径分隔符的问题,string s=Path.,Combine,(c:temp,a.jpg),string GetDirectoryName(string path)(*),得到文件的路径名。,Path.GetDirectoryName(c:tempa.jpg),string GetExtension(string path),得到文件的扩展名,string GetFileName(string path),得到文件路径的文件名部分,string GetFileNameWithoutExtension(string path),得到去除扩展名的文件名,string GetFullPath(string path),得到文件的全路径。可以根据相对路径获得绝对路径。,string,GetTempFileName,(),得到一个唯一的临时文件名,(*),string,GetTempPath(),得到临时文件夹的路径,(*),操作目录,资料管理器,为了实现目录树,所以要掌握读取目录的类,Directory,和,DirectoryInfo,void Delete(string path,bool recursive),删除目录,,recursive,表示是否递归删除,如果,recursive,为,false,则只能删除空目录,bool Exists(string path),判断目录是否存在,move(),CreateDirectory(),string GetDirectories(string path),得到一个目录下的子目录,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),得到目录的父目录,知识补充,1,(*),Path.Combine(path1,path2),,见,MSDN,如果指定的路径之一是零长度字符串,则该方法返回其他路径,。,如果,path2,包含绝对路径,则该方法返回,path2,。,如果,path1,不是以分隔符结束,并且不是,c:,或,d:,等(驱动器引用),则在串联前为,path1,增加,分隔符。,分隔符:,(,与操作系统平台有关,),Path.DirectorySeparatorChar,Path.PathSeparator;,Path.VolumeSeparatorChar:,Path.GetFileName(),获取文件名,当目录为,c:windowstest,时,可获取最后一个目录名,但当目录路径为,c:windowstest,时,不可以。,reflector,查看,知识补充,2,(*),获取当前,exe,文件执行的路径:,Assembly.GetExecutingAssembly().Location;,不要用:,Directory.GetCurrentDirectory();,获取应用程序的当前工作目录。因为这个可能会变,通过使用,OpenFileDialog,或者手动设置,Directory.SetCurrentDirectory(),做,WinForm,程序时会常用到。,完善昨天的“文件管理器”,双击目录节点时会报错。怎么判断当前双击的是文件节点?,Tag,是否为,null,资料管理器,通过,treeview,显示两级目录,动态添加,treeview,节点。,di.GetDirectories(),获取所有的根文件夹,TreeNode tn=new TreeNode();,tn.Text=d.Name;,tn.Tag=d.FullName;,treeView1.Nodes.Add(tn);,遍历根文件夹的同时添加二级节点,三级节点上添加文件的名儿,双击文本节点(怎么判断是否是文本节点?)在文本框中显示资料的内容,递归的方式 显示无限极节点,操作文件,文本文件编码,文本文件有不同的存储方式,将字符串以什么样的形式保存为二进制,这个就是编码,,UTF-8,、,ASCII,、,Unicode,等,如果出现乱码一般就是编码的问题,文本文件相关的函数一般都有一个,Encoding,类型的参数,取得编码的方式:,Encoding.Default,、,Encoding.UTF8,、,Encoding.GetEncoding(GBK),输出,Encoding.GetEncodings(),,所有编码。,什么是文本文件。拖到记事本中还能看得懂的就是文本文件,,doc,不是。,File,类的常用静态方法,:,(FileInfo*),void AppendAllText(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 contents),,将字符串数组逐行保存到文件,path,中,会覆盖旧内容。,File,类的方法,1,File.Copy(“source”,“targetFileName”,true);/,文件拷贝,true,表示当文件存在时“覆盖”,如果不加,true,则文件存在报异常。,File.Exists();/,判断文件是否存在,File.Move(“source”,“target”);/,移动(剪切),思考如何为文件重命名?,File.Delete(“path”);/,删除。如果文件不存在?不存在,不报错,File.Create(“path”);/,创建文件,File,类的方法,2,:操作文本文件,File.ReadAllLines(“path”,Encoding.Default);/,读取所有行,返回,string,File.ReadAllText(“path”,Encoding.Default);/,读取所有文本返回,string,File.ReadAllBytes(“path”);/,读取文件,返回,byte,=,File.WriteAllLines(“path”,new string4,Encoding.Default);,/,将,string,数组按行写入文件。,File.WriteAllText(“path”,“string”);/,将字符串全部写入文件,File.WriteAllBytes(“path”,new byte5);/,将,byte,全部写入到文件,File.AppendAllText()/,将,string,追加到文件,File,类的方法,3,:快速得到文件流,File.Open();/,返回,FileStream,File.OpenRead();/,返回只读的,FileStream,File.OpenWrite();/,返回只写的,FileStream,文件流?,两个大水缸,把一个缸中的水倒入另一个水缸中。两种方式:,直接把一个缸中的水倒入另一个缸中,用个桶来把一个缸中的水舀到另一个缸中。,文件流,拷贝文件的两种方式:将源文件内容全部读到内存中,再写到目标文件中;读取源文件的,1KB,内存,写到目标文件中,再读取源文件的,1KB,内存,再写到目标文件中,。第二种方式就是一种流的操作。,用,File.ReadAllText,、,File.WriteAllText,进行文件读写是一次性读、写,如果文件非常大会占内存、慢。需要读一行处理一行的机制,这就是流,(Stream),。,Stream,会只读取要求的位置、长度的内容。,Stream,不会将所有内容一次性读取到内存中,有一个指针,指针指到哪个字节就从哪个字节开始读、写。,流有很多种类,文件流是其中一种。,FileStream,类,new FileStream(“c:/a.txt”,filemode,fileaccess),后两个参数可选值及含义自己看。,FileStream,可读可写。可以使用,File.OpenRead,、,File.OpenWrite,这两个简化调用方法。,byte,是任何数据的最根本表示形式,任何数据最终都是二进制。,FileStream,的,Position,属性为当前文件指针位置,每写一次就要移动一下,Position,以备下次写到后面的位置。,Write,用于向当前位置写入若干字节,,Read,用户读取若干字节。,(*),使用,using,可以方便的释放资源,(,自动调用,Dispose,方法,),只有实现了,IDispose,接口的类才能使用,using,释放资源,使用,FileStream,写入文本文件。,演示通过,FileStream,写入读取文本文件。对于中文