第6章文件和流.ppt

上传人:本田雅阁 文档编号:2578272 上传时间:2019-04-11 格式:PPT 页数:37 大小:235.01KB
返回 下载 相关 举报
第6章文件和流.ppt_第1页
第1页 / 共37页
第6章文件和流.ppt_第2页
第2页 / 共37页
第6章文件和流.ppt_第3页
第3页 / 共37页
亲,该文档总共37页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第6章文件和流.ppt》由会员分享,可在线阅读,更多相关《第6章文件和流.ppt(37页珍藏版)》请在三一文库上搜索。

1、第6章 文件和流,6.1 用流读写文件 6.2 File类和FileInfo类 6.3 Directory类和DirectoryInfo类,6.1 用流读写文件,C#把所有文件都看成是顺序字节流,用抽象类Stream代表一个流。Stream类有许多派生类,例如FileStream类,以字节为单位读写文件;BinaryRead类和BinaryWrite类,以基本数据类型为单位读写文件,可以从文件直接读写bool、String、int16、int等基本数据类型数据;StreamReader和StreamWriter类以字符或字符串为单位读写文件。本节首先介绍这些类的用法,然后介绍数据的序列化。使用

2、流读写文件必须引入命名空间:System.IO。,6.1.1 FileStream类读写字节,使用FileStream类可以建立文件流对象,用来打开和关闭文件,以字节为单位读写文件。也可对与文件相关的操作系统句柄进行操作,如管道、标准输入和标准输出。FileStream类对象能对输入输出进行缓冲,从而提高性能。 例子,写文件,写字节数组数据到文件的程序如下,该程序将建立文件d:/g1.bin。,using System; using System.IO; /使用文件必须引入的命名空间 class WriteFile static void Main() byte data=new byte10

3、; /建立字节数组 for(int i=0;i10;i+) /为数组赋值 datai=(byte)i; FileStream fs= /建立流对象 new FileStream(“d:/g1.bin“,FileMode.Create); /写data字节数组中的所有数据到文件 fs.Write(data,0,10); fs.Close() /不再使用的流对象,必须关闭。 /垃圾收集器不能自动清除流对象,读一个文件所有字节到数组并在屏幕显示的程序如下,请先用上例建一个文件,然后用此例读出。 using System; using System.IO; /使用文件必须引入的命名空间 class R

4、eadFile static void Main() FileStream fs= new FileStream(“d:/g1.bin“,FileMode.Open); byte data=new bytefs.Length; long n=fs.Read(data,0,(int)fs.Length);/n为所读字节数 fs.Close(); Console.WriteLine(“文件的内容如下:“); foreach(byte m in data) Console.Write(“0,“,m); ,移动文件读写位置 using System; using System.IO; /使用文件必须引

5、入的命名空间 class FileStreamProperty static void Main() FileStream fs= /无第3个参数 new FileStream(“d:/g1.bin“,FileMode.Open); /文件读写位置移到从文件尾部向前5个字节 fs.Seek(-4,SeekOrigin.End); Console.WriteLine(“读写位置:0, 能定位:1“,fs.Position,fs.CanSeek); Console.WriteLine(“能读:0, 能写:1“,fs.CanRead,fs.CanWrite); fs.Close(); ,6.1.2

6、BinaryReader、BinaryWriter 类读写基本数据类型,使用BinaryReader和BinaryWriter类可以从文件直接读写bool、String、int16、int等基本数据类型数据。 写int类型数据程序如下:,using System; using System.IO;/使用文件必须引入的命名空间 class WriteFile static void Main() FileStream fs=new FileStream(“d:/g1.dat“,FileMode.Create); BinaryWriter w=new BinaryWriter(fs); for(i

7、nt i=0;i10;i+) w.Write(i); /写入int类型数据 w.Close(); ,读int类型数据程序如下,先用上例建一个文件,然后用此例读出。 using System; using System.IO; /使用文件必须引入的命名空间 class ReadFile static void Main(), int data=new int10; FileStream fs=new FileStream(“d:/g1.dat“,FileMode.Open); BinaryReader r=new BinaryReader(fs); for(int i=0;i10;i+) dat

8、ai=r.ReadInt32(); r.Close(); Console.WriteLine(“文件的内容如下:“); foreach(int m in data) Console.Write(“0,“,m); ,6.1.3 StreamReader和StreamWriter 类读写字符串,读写字符串可以用StreamReader和StreamWriter类。 写字符串类型数据程序如下: using System; using System.IO; class WriteFile static void Main() StreamWriter w=new StreamWriter(“d:/g.

9、text“,false); w.Write(100); /100首先转换为字符串,再写入。 w.Write(“100个“);/字符串之间用换行符(“n“或“rn“)分隔 w.Write(“End of file“);/一个字符串叫做文件中的一行 w.Close(); ,读字符串程序如下,请先用上例建一个文件,然后用此例读出。 using System; using System.IO; using System.Collections.Generic; /使用泛型集合类必须引入的命名空间 class ReadFile static void Main() string sLine=“; /建立

10、元素为string类型的List对象 List arrText = new List(); using(StreamReader objReader= new StreamReader(“d:/g.text“),/使用using语句以确保所涉及的文件在写入或读取操作后正确关闭 do sLine=objReader.ReadLine(); if(sLine!=null) arrText.Add(sLine); while(sLine!=null); Console.WriteLine(“文件的内容如下:“); foreach(string m in arrText) Console.Write(

11、“0“,m); ,6.1.4 序列化,对于一个复杂的数据结构,例如数组,用以上方法存入文件,就显得过于复杂了。为了简化这类问题,C#提出了序列化的概念,序列化包括序列化和反序列化,所谓序列化就是把类的对象作为一个整体存入文件,反序列化则是相反的过程。C#中的许多类都支持序列化,可以用如下方法判别一个类是否支持序列化: Dictionary h =/建立泛型哈希表对象 new Dictionary(); Type myType=h.GetType(); /如为true,支持序列化,这里myBool=true bool myBool=myType.IsSerializable; 【例6.1】下边的

12、例子完成了一个哈希表对象的序列化。,using System; using System.IO; /使用泛型集合类引用的命名空间 using System.Collections.Generic; /使用序列化引用的命名空间 using System.Runtime.Serialization.Formatters.Binary; /使用序列化引用的命名空间 using System.Runtime.Serialization; class SerialFile static void Main() Dictionary h= /建立哈希表对象 new Dictionary(); h.Add(

13、“键1“, “值1“);/哈希表的每一个元素是一对键值 h.Add(“键2”, “值2”);/例如商品编号和商品名称 /通过键值,可以很容易找到键值对应的值 h.Add(“键3“, “值3“);,FileStream fs = /序列化数据 new FileStream(“d:/d.dat“, FileMode.Create); BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(fs, h); fs.Close(); /下句为反序列化数据 fs = new FileStream(“d:/d.dat“,

14、FileMode.Open); h.Clear(); h = (Dictionary) formatter.Deserialize(fs); fs.Close();/下句显示反序列化数据 foreach (KeyValuePair h1 in h) Console.WriteLine(“0:1;“, h1.Key, h1.Value); /注意哈希表用法 ,自己定义的类也可以序列化,只要在类定义前增加Serializable即可,书中例子首先定义了一个可序列化的类Person,建立若干Person类对象,存到List类对象中,并将List类对象序列化。,6.1.5 Stream类的其他派生类,

15、Stream类的其他派生类包括:MemoryStream、BuffereStream、NetworkStream(在System.Net.Sockets命名空间)。其中MemoryStream类把文件放到内存中,极大地提高了文件读写速度,例子见8.5节和13.5.5节。BuffereStream类为文件读写建立一个缓冲区,写文件先把文件存到缓冲区中,缓冲区满了以后,才写入物理设备。先从文件读入较多数据到缓冲区,读文件先从缓冲区读,缓冲区没有所需数据,才再一次从物理设备读数据到缓冲区,用这样的方法改善文件读写的性能。NetworkStream类把网络传输的数据也看作流。请用帮助查看这些类的用法。

16、,6.2 File类和FileInfo类,C#语言中通过File和FileInfo类来创建、复制、删除、移动和打开文件。在File类中提供了一些静态方法,使用这些方法可以完成上述功能,但File类不能建立对象。FileInfo类使用方法和File类基本相同,但FileInfo类能建立对象。在使用这两个类时需要引用System.IO命名空间。这里重点介绍File类的使用方法。 6.2.1 File类常用的方法 见书,6.2.1 判断文件是否存在,判断文件是否存在的方法声明如下:public static bool Exists(string path);该方法判断参数指定的文件是否存在,参数pa

17、th指定文件路径。如果文件存在,返回true,如果文件不存在,或者访问者不具有访问此文件的权限,或者path描述一个目录,返回false。下面的代码段判断是否存在c:Examplee1.txt文件: if(File.Exists(“c:Examplee1.txt“) /为处理代码,6.2.3 删除文件,删除文件方法:public static void Delete(string path);该方法删除参数指定的文件,参数path指定要删除的文件的路径。下面的程序删除用户指定文件。 using System; using System.IO; class DeleteFile static v

18、oid Main() Console.WriteLine(“请键入要删除的文件的路径:“); string path=Console.ReadLine();/从键盘读入路径,输入回车结束 if(File.Exists(path)/表示其后字符串不包括转义字符 File.Delete(path); else Console.WriteLine(“文件不存在!“); ,6.2.4 复制文件,复制文件方法:public static void Copy(string sFName,string dFName,bool overW); 该方法将参数sFName指定文件拷贝到参数destFileName

19、指定的目录,修改文件名为参数dFName指定的文件名,如果OverW为true,而且文件名为dFName的文件已存在的话,将会被复制过去的文件所覆盖。文件复制例子如下: using System; using System.IO; class CopyFile static void Main() Console.WriteLine (“请键入要拷贝的源文件的路径:“);,/从键盘读入路径,输入回车结束 string path=Console.ReadLine(); Console.WriteLine (“请键入要拷贝的目的文件的路径(包括文件名):”); /从键盘读入路径,输入回车结束 st

20、ring path1=Console.ReadLine(); if(File.Exists(path) /表示其后字符串不包括转义字符 if(!File.Exists(path1)/如果不存在目的文件,拷贝 File.Copy(path,path1,true); else Console.WriteLine(“目的文件存在或目的路径非法!“); else Console.WriteLine(“源文件不存在!“); ,6.2.5 移动文件,移动文件方法:public static void Move(string sFName,string dFName);该方法将参数sFName指定文件移动到

21、参数dFName指定的目录,修改文件名为参数dFName指定的文件名,如果目标文件已经存在,或者路径格式不对,将引发异常。注意,只能在同一个逻辑盘下进行文件转移。如果试图将c盘下的文件转移到d盘,将发生错误。下面的代码可以将c:Example下的e1.txt文件移动到c盘根目录下。 File.Move(“c:ExampleBackUp.txt“,“c:BackUp.txt“); FileInfo类方法MoveTo可以将一个逻辑盘的文件移到另一个逻辑盘,例子如下: using System; using System.IO; class MoveFile static void Main() C

22、onsole.WriteLine(“请键入要移动的源文件的路径:“);,string path=Console.ReadLine();/从键盘读入路径,输入回车结束 Console.WriteLine (“请键入要移动的目的文件的路径(包括文件名):“); string path1=Console.ReadLine();/从键盘读入路径,输入回车结束 if(File.Exists(path) /表示其后字符串不包括转义字符 if(!File.Exists(path1) FileInfo fi=new FileInfo(path);/使用FileInfo必须建立对象 fi.MoveTo(path

23、1);/fi所代表的文件移到path1指定的位置 /File.Move(path,path1);/如在同一磁盘可使用此句替换前2句 else Console.WriteLine(“目的文件存在或路径非法!“); else Console.WriteLine(“源文件不存在!“); ,6.2.6 设置文件属性,设置文件属性方法:public static void SetAttributes(string path,FileAttributes fileAbs);参数path指定要修改属性的文件路径;参数fileAbs指定要修改的文件属性,可以是如下数值:Archive(存档)、Compress

24、ed(压缩文件)、Directory(目录文件)、Encrypted(加密)、Hidden(隐藏)、Normal(普通文件)、ReadOnly(只读文件)、System(系统文件)、Temporary(临时文件)。下面代码设置文件c:e1.txt的属性为只读、隐藏。 File.SetAttributes(“c:e1.txt“,FileAttributes.ReadOnly|FileAttributes.Hidden);,6.2.7 得到文件的属性,方法声明如下:public static FileAttributes GetAttributes(string path);方法返回参数指定的文件

25、的FileAttributes,如果未找到路径或文件,返回-1,例子如下: using System; using System.IO; class GetFileAttributes static void Main() Console.WriteLine(“请键入要得到属性的文件路径:”); /从键盘读入路径,输入回车结束 string path=Console.ReadLine(); if(File.Exists(path) /表示其后字符串不包括转义字符 FileAttributes attributes= File.GetAttributes(path);,if(attributes

26、 ,6.3 Directory类和DirectoryInfo类,C#语言中通过Directory类来创建、复制、删除、移动文件夹。在Directory类中提供了一些静态方法,使用这些方法可以完成上述功能。Directory类不能建立对象。DirectoryInfo类使用方法和Directory类基本相同,但DirectoryInfo类能建立对象。在使用这两个类时需要引用System.IO命名空间。这里重点介绍Directory类的使用方法。 6.3.1 Directory类常用的方法 见书,6.3.2 判断目录是否存在,方法声明如下:public static bool Exists(stri

27、ng path);该方法判断参数指定目录是否存在,参数path指定目录的路径。如果目录存在,返回true,如果目录不存在,或者访问者不具有访问此目录权限,返回false。下面代码判断是否存在c:Dir1Dir2目录。 if(Directory.Exists(“c:Dir1Dir2“) /为处理代码,6.3.3 创建目录,using System; using System.IO; class CreateFileDirectory static void Main() Console.WriteLine(“请键入要创建的目录路径:”); /从键盘读入路径,输入回车结束 string path=

28、Console.ReadLine(); if(!Directory.Exists(path) Directory.CreateDirectory(path); else Console.WriteLine(“目录已存在或目录非法!”); ,6.3.4 删除目录,using System; using System.IO; /使用文件必须引入的命名空间 class DeleteFile static void Main() Console.WriteLine(“请键入要删除的目录的路径:“); string path=Console.ReadLine();/从键盘读入路径回车结束 if(Dire

29、ctory.Exists(path) Directory.Delete(path); else Console.WriteLine(“目录不存在或目录非法!”); ,6.3.5 移动目录,移动目录方法:public static void Move(string sourceDirName,string destDirName);该方法将文件或目录及其子目录移到新位置,如果目标目录已经存在,或者路径格式不对,将引发异常。注意,只能在同一个逻辑盘下进行目录转移。如果试图将c盘下的目录转移到d盘,将发生错误。下面的代码可以将目录c:Dir1Dir2移动到c:Dir3Dir4。 Directory.

30、Move(“c:Dir1Dir2“,“c:Dir3Dir4“); Directory Info类方法MoveTo可以将一个逻辑盘的目录移到另一个逻辑盘,例子如下: using System; using System.IO; class DeleteFile static void Main() Console.WriteLine(“请键入要移动的源目录的路径:“); string path=Console.ReadLine();,Console.WriteLine(“请键入要移动的目的目录的路径:“); string path1=Console.ReadLine(); if(Director

31、y.Exists(path) if(!Directory.Exists(path1) DirectoryInfo dir=new DirectoryInfo(path); dir.MoveTo(path1); /Directory.Move(path,path1); /如两个目录在同一磁盘中,可用被注解的语句替换前2句 else Console.WriteLine(“目的目录已存在!“); else Console.WriteLine(“源目录不存在!“); ,6.3.6 获取当前目录下所有子目录,using System; using System.IO; /使用文件必须引入的命名空间 cl

32、ass DeleteFile static void Main() Console.WriteLine(“请键入目录的路径:”);/例如键入:d:/ string path=Console.ReadLine(); if(Directory.Exists(path) string Directorys; Directorys=Directory.GetDirectories(path); foreach(string aDir in Directorys) Console.WriteLine(aDir); else Console.WriteLine(“目录不存在!“); ,6.3.7 获取当前

33、目录下的所有文件,using System; using System.IO; class DeleteFile static void Main() Console.WriteLine(“请键入目录的路径:“); string path=Console.ReadLine(); if(Directory.Exists(path) string files; files=Directory.GetFiles(path); foreach(string aFile in files) Console.WriteLine(aFile); else Console.WriteLine(“目录不存在!“); ,6.3.8 设置目录属性,与文件属性相同,目录属性也是使用FileAttributes来进行设置的。下面的代码设置c:Dir1Dir2目录为只读、隐藏。 DirectoryInfo DirInfo= new DirectoryInfo(“c:Dir1Dir2“); DirInfo.Atttributes= FileAttributes.ReadOnly|FileAttributes.Hidden;,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1