第9章文件操作.ppt_第1页
第9章文件操作.ppt_第2页
第9章文件操作.ppt_第3页
第9章文件操作.ppt_第4页
第9章文件操作.ppt_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、,第9章 文件操作,教学目标 教学重点 教学过程,第1页,2020年8月3日,第2页,教学目标,通过本章的学习,应掌握读写计算机磁盘上的文件,第3页,教学重点,掌握文件读写数据的类的使用场合和方法,第4页,教学过程,讲解各个文件读写数据的类的使用方法 【随堂演练】巩固学习成果,5,System.IO命名空间,DriveInfo类可以用来获取服务器的本地系统注册的驱动器的详细信息,命名空间为System.IO.DriveInfo DriveInfo类的主要成员: TotalSize:获取驱动器上存储空间的总容量,以字节为单位。它包含所有已分配的空间和空闲的空间。 TotalFreeSize:获取

2、驱动器上的可用空间总量。 AvailableFreeSpace:指示驱动器上的可用空闲空间,以字节为单位。其值可能小于TotalFreeSpace,因为ASP.NET可用的磁盘配额可能有限制。 DriveFormat:返回文件系统的名称,例如NTFS或FAT32。,6,9.1 DriveInfo类,DriveType:返回驱动器类型。表明驱动器为固定硬盘、网络驱动器、CD-ROM还是可移动硬盘。 IsReady:返回一个bool类型的值,该值表明驱动器是否已经准备好。对于可移动驱动器在没有插入时可能会出现“未就绪”的状态。 Name:获取驱动器的名称。如C:或者D:。 VolumLabel:获

3、取或设置驱动器的卷标。NTFS格式的驱动器上,卷标名可以长达32个字符。如果没有设置卷标,该属性值为空。 RootDiretory:获取驱动器的根目录。 GetDrives()静态方法:检索计算机上的所有逻辑驱动器的驱动器名称。该方法返回的是一个DriveInfo的对象集合。,7,9.1 DriveInfo类的主要成员,8,9.1 DriveInfo类的主要成员,示例:显示本地驱动器的信息(/9.1/9.1.1/Default.aspx ) protected void Page_Load(object sender, EventArgs e) System.IO.DriveInfo driv

4、er = new System.IO.DriveInfo(C:); Response.Write(Driver Name: + driver.Name + ); Response.Write(Driver Type: + driver.DriveType.ToString() + ); Response.Write(Available Free Space : + driver.AvailableFreeSpace.ToString() + ); Response.Write(Driver Format : + driver.DriveFormat + ); Response.Write(To

5、tal Free Space: + driver.TotalSize.ToString() + ); Response.Write(VolumeLabel: + driver.VolumeLabel + ); ,9,9.1 DriveInfo类的主要成员,示例:枚举本地文件系统上的所有驱动器(/9.1/9.1.21/Default.aspx ) foreach (DriveInfo drive in DriveInfo.GetDrives() ) /遍历本地文件系统 TreeNode node = new TreeNode(); node.Value = drive.Name; if (dri

6、ve.IsReady) node.Text = drive.Name + -(free space: + drive.AvailableFreeSpace + ); else node.Text = drive.Name + -(not ready);,10,9.1 treeview控件,treeview 控件类似资源管理器的树形结构,在树形结构中单击,在右边显示内容,层次清晰且方便快捷,treeview控件属于microsoft webcontrols,窗体中HTML代码为:,11,9.1 treeview控件,属性: 1、autoselect=”false”:当访问者在treeview控件

7、中对节点进行定位时,可以使用键盘上的箭头来进行定位。属性值为“false“,则不允许这样做。2、Showplus=”true”:当两个节点收到一起的时候,你可以显示一个加号(+),访问者就知道这个节点可以展开,该属性值为“true“将使用加号,否则不使用。3、Showlines=”true”:在一个treeview控件中的两个节点之间,可以显示一些线长,为”true”显示。4、Expandlevel=2:用来定义treeview控件的层次结构展开的级别数。5、navigateurl:点击节点时的跳转网址,12,9.1 treeview控件,属性: 6、index:获取树节点在树节点集合中的位置

8、 7、nodes:获取分配给树视图控件的树节点集合 8、parent:获取或设置控件的父容器 9、selectednode:获取或设置当前在树视图控件中选定的树节点 10、text:获取或设置在树节点标签中显示的文本 11、expand:展开树节点 12、clear:清空树 13、remove:移除当前树节点 14、checked:用以指明该树节点是否处于选中状态,System.IO.Directory类和System.DirectoryInfo类,主要提供关于目录的各种操作 Directory (File)类的静态方法对所有方法执行安全检查。如果打算多次重用一个对象,可以考虑改用Direct

9、oryInfo(FileInfo)的相应实例方法,因为安全检查并不总是必要的。,13,9.2 Directory类和DirectoryInfo类,Directory类:是一个静态实用类,所以可以在类上使用他们,而不需要创建实例。 Directory.CreateDirectory:创建目录 Directory.Delete:删除目录 Directory.Move:目录移动 Directory.GetDirectories:获取指定目录下的所有子目录 Directory.GetFiles:获取指定目录下的所有文件 Directory.Exist:判断目录是否存在 Directory.GetPar

10、ent:获取指定目录父目录,14,9.2 Directory类,Directory.CreateDirectory:创建目录 private void MakeDirectory() Directory.CreateDirectory(c:tempuploadsNewDirectoty); 注意:本章处理的表示文件或目录路径的字符串,该字符串中有许多“”字符,所以加上前缀表示,这个字符串应逐个字符地解释, “”解释为“”,而不是解释为转义字符。如果没有前缀,就要用“”来代替“”,以避免把这个字符解释为转义字符,15,9.2 Directory类,Directory.Delete:删除目录 pr

11、ivate void DeleteDirectory() Directory.Delete(c:tempuploadsBackUp,true); 注意:Delete方法的第二个参数为bool类型,它可以决定是否删除非空目录。如果该参数值为true,将删除整个目录,即使该目录下有文件或子目录;若为false,则仅当目录为空时才可删除,默认值为false。,16,9.2 Directory类,Directory.Move:目录移动 该方法声明如下: public static void Move(string sourceDirName,string destDirName); 下面的代码将目录c

12、:tempuploadsNewDirectory移动到 c:tempuploadsBackUp。 private void MoveDirectory() File.Move(c:tempuploadsNewDirectory,c:tempuploadsBackUp); ,17,9.2 Directory类,Directory.GetDirectories:获取指定目录下的所有子目录 读出c:tempuploads目录下的所有子目录,并将其存储到字符串数组中 private void GetDirectory() string Directorys; Directorys = Director

13、y. GetDirectories (c:tempuploads); ,18,9.2 Directory类,Directory.GetFiles:获取指定目录下的所有文件 读出c:tempuploads目录下的所有文件,并将其存储到字符串数组中。 private void GetFile() string Files; Files = Directory. GetFiles (c:tempuploads,); ,19,9.2 Directory类,Directory.Exist:判断目录是否存在 判断是否存在c:tempuploadsNewDirectory目录。若存在,先获取该目录下的子目录

14、和文件,然后其移动,最后将移动后的目录删除。若不存在,则先创建该目录,然后将目录属性设为只读、隐藏。 if(File.Exists(c:tempuploadsNewDirectory) /判断目录是否存在 GetDirectory(); /获取子目录 GetFile(); /获取文件 MoveDirectory(); /移动目录 DeleteDirectory(); /删除目录 else MakeDirectory(); /生成目录 SetDirectory(); /设置目录属性 ,20,9.2 Directory类,Directory.GetParent:获取指定目录父目录 public v

15、oid DeleteDirectory() DirectoryInfo dinfo dinfo = Directory.GetParent(c:tempuploadsNewDirectory); ,21,9.2 Directory类,示例:/9.2/9.2.1/Default.aspx if (RadioButton1.Checked) System.IO.Directory.CreateDirectory(TextBox1.Text); /创建目录 Label1.Text = 创建时间: + System.IO.Directory.GetCreationTime(TextBox1.Text)

16、 + ; Label1.Text += 父目录: + System.IO.Directory.GetParent(TextBox1.Text).FullName + ; return; if (System.IO.Directory.Exists(TextBox1.Text) System.IO.Directory.Delete(TextBox1.Text); Label1.Text = 目录 + TextBox1.Text + 已删除; return; Label1.Text = 此目录不存在;,22,9.2 Directory类,DirectoryInfo类和Directory类不同的是,

17、它的方法和属性不是静态的,需要实例化类,把它和特定的目录联系起来。 DirectoryInfo类的方法: DirectroyInfo.Create:创建目录 DirectoryInfo.Delete:删除目录 DirectoryInfo.MoveTo:移动目录 DirectroyInfo.CreateSubdirectroy:创建子目录 DirectroyInfo.GetFiles:获取当前目录的文件列表 DirectroyInfo.GetDirectories:返回当前目录的子目录,23,9.2 DirectoryInfo类,24,9.2 DirectoryInfo类,DirectroyIn

18、fo.Create:创建目录 private void MakeDirectory() DirectoryInfo diInfo = new DirectoryInfo (c:tempuploadsNewDirectory); diInfo.Create(); 注意:如果目录已经存在,则此方法不执行任何操作,DirectoryInfo.Delete:删除目录 private void DeleteDirectory() DirectoryInfo diInfo = new DirectoryInfo (c:tempuploadsNewDirectory); diInfo.Delete(true

19、); 注意:Delete方法的参数为bool类型,它可以决定是否删除非空目录。如果该参数值为true,将删除整个目录,即使该目录下有文件或子目录;若为false,则仅当目录为空时才可删除,默认值为false。,即Delete()和Delete(false)效果是相同的,25,9.2 DirectoryInfo类,DirectoryInfo. MoveTo:移动目录 下面的代码将目录c:tempuploadsNewDirectory移动到 c:tempuploadsBackUp。 private void MoveDirectory() DirectoryInfo diInfo = new Di

20、rectoryInfo (c:tempuploadsNewDirectory); diInfo.MoveTo(c:tempuploadsBackUp); 注意:DirectoryInfo.MoveTo不能将目录移动到一个已经存在的目录中,否则会产生错误。,26,9.2 DirectoryInfo类,DirectoryInfo.CreateSubDirectory:创建子目录 下面的代码将目录c:tempuploadsNewDirectory移动到 c:tempuploadsBackUp。 private void MoveDirectory() DirectoryInfo diInfo = n

21、ew DirectoryInfo (c:tempuploads); diInfo. CreateSubDirectory(NewDirectory); 注意:路径名称最多不能超过249个字符。,27,9.2 DirectoryInfo类,DirectoryInfo.GetFiles:获取当前文件目录的文件列表 格式: TheFolder.GetFiles( searchPattern ) 以FileInfo数组的形势返回DirectoryInfo 目录下的所有文件,支持通配符查找;参数searchPattern用来指定搜索字符串,如果DirectoryInfo中没有与搜索字符串匹配的文件,则此

22、方法返回一个空数组。 /遍历指定文件夹中的所有文件 DirectoryInfo TheFolder=new DirectoryInfo(folderFullName); foreach(FileInfo NextFile in TheFolder.GetFiles() /遍历文件 this.listBox2.Items.Add(NextFile.Name); TheFolder.GetFiles( *.txt ) /搜索扩展名为txt的所有文件 注意:扩展名恰好是三个字符时的参数searchPattern匹配行为与扩展名多于三个字符时不同。恰好为三个字符的searchPattern返回扩展名为

23、三个或三个以上的字符的文件。一个字符、两个字符或三个以上字符的searchPattern只返回扩展名恰好等于该长度的文件。,28,9.2 DirectoryInfo类,Directory.GetDirectories:获取指定目录下的所有子目录 参数形势和GetFiles类似,如果没有子目录,则只返回根目录 DirectoryInfo TheFolder=new DirectoryInfo(folderFullName); /遍历文件夹 foreach(DirectoryInfo NextFolder in TheFolder.GetDirectories() this.listBox1.It

24、ems.Add(NextFolder.Name);,29,9.2 DirectoryInfo类,采用递归的方式遍历,文件夹和子文件中的所有文件。 public void FindFile(string dirPath) /参数dirPath为指定的目录 /在指定目录及子目录下查找文件,在listBox1中列出子目录及文件 DirectoryInfo Dir=new DirectoryInfo(dirPath); foreach(DirectoryInfo d in Dir.GetDirectories() /查找子目录 FindFile(Dir+d.ToString()+); listBox1

25、.Items.Add(Dir+d.ToString()+); /listBox1中填加目录名 foreach(FileInfo f in Dir.GetFiles(*.-) /查找文件 listBox1.Items.Add(Dir+f.ToString(); /listBox1中填加文件名 ,30,9.2 DirectoryInfo类,DirectoryInfo类的属性 DirectoryInfo.Attributes:获取和设置目录属性 DirectoryInfo.CreationTime:获取目录的创建时间 DirectoryInfo.Name:获取目录的名称 DirectoryInf.F

26、ullName:获取目录完整路径 DirectoryInfo.Parent:获取指定子目录的父目录 DirectoryInfo.Root:获取指定目录的根目录,31,9.2 DirectoryInfo类,32,9.2 DirectoryInfo类,DirectoryInfo.Attributes:获取和设置目录属性 该属性使用FileAttributes枚举类型来获取或设置目录属性。它所包含的成员如下:,Archive 文件的存档状态。应用程序使用此属性为文件加上备份或移除标记。 Compressed 文件已压缩。 Device保留供将来使用。 Directory 文件为一个目录。 Encry

27、pted 该文件或目录是加密的。对于文件来说,表示文件中的所有数据都是加密的。对于目录来说,表示新创建的文件和目录在默认情况下是加密的。 Hidden 文件是隐藏的,因此没有包括在普通的目录列表中。 Normal 文件正常,没有设置其他的属性。此属性仅在单独使用时有效。,33,9.2 DirectoryInfo类,DirectoryInfo.Attributes:获取和设置目录属性,NotContentIndexed 操作系统的内容索引服务不会创建此文件的索引。 Offline 文件已脱机。文件数据不能立即供使用。 ReadOnly 文件为只读。 ReparsePoint 文件包含一个重新分析

28、点,它是一个与文件或目录关联的用户定义的数据块。 SparseFile 文件为稀疏文件。稀疏文件一般是数据通常为零的大文件。 System 文件为系统文件。文件是操作系统的一部分或由操作系统以独占方式使用。 Temporary 文件是临时文件。文件系统试图将所有数据保留在内存中以便更快地访问,而不是将数据刷新回大容量存储器中。不再需要临时文件时,应用程序会立即将其删除。,34,9.2 DirectoryInfo类,DirectoryInfo.Attributes:获取和设置目录属性 下面的代码设置c:tempuploadsNewDirectory目录为只读、隐藏。与文件属性相同,目录属性也是使

29、用FileAttributes来进行设置的。 private void SetDirectory() DirectoryInfo NewDirInfo = new DirectoryInfo(c:tempuploadsNewDirectoty); NewDirInfo.Atttributes = FileAttributes.ReadOnly|FileAttributes.Hidden; FileAttributes.Attributes = fi.Attributes /取消属性设定 ,35,9.2 DirectoryInfo类,DirectoryInfo.CreationTime:获取目录

30、的创建时间 private void CreationTime() DirectoryInfo NewDirInfo = new DirectoryInfo(c:tempuploadsNewDirectoty); DateTime ctime=info.CreateTime; 注意:如果目录不存在,该属性不会抛出异常,返回值也不是空,而是“1901-1- 8:00:00,36,9.2 DirectoryInfo类,DirectoryInfo.Name:获取目录的名称 DirectoryInf.FullName:获取目录完整路径 DirectoryInfo dir = New Directory

31、Info(”.”); Sting dirName = dir.Name Sting FullName = dir.FullName,37,9.2 DirectoryInfo类,DirectoryInfo.Parent:获取指定子目录的父目录 DirectoryInfo dis = di.CreateSubDirectory(”c:publicbin“); DirectoryInfo parentDir = dis.Parent; String parentpath = parentDir.FullName; 注意:如果目录不存在或指定的目录是根目录,则返回值为空(Null)。,38,9.2 D

32、irectoryInfo类,DirectoryInfo.Root:获取指定目录的根目录 DirectoryInfo dis = di.CreateSubDirectory(”c:publicbin“); DirectoryInfo rootDir = dis.Parent; String rootpath = rootDir.FullName;,FileInfo和File是表示文件系统上的文件信息 File类的成员都是静态的。所以 用file就不象fileinfo那样,每次都实例化一个对象,直接用就可以,但是你每次调用File的静态方法的时候,都要进行一次安全检查,这样系统开销就大了。 Fil

33、e类多用在对文件的一次性操作。 FileInfo类是实例化类,在你第一次创建fileinfo对象时候进行一次安全检查,之后调用它的任何方法都不用进行安全检查了 。这样效率就提高了。 Fileinfo多用在对文件的重复操作。,39,9.3 File类和FileInfo类,File类的主要静态方法 File.Open:文件打开 File.Create:文件创建 File.Delete:文件删除 File.Copy:文件复制 File.Move:文件移动(也可用来文件重命名) File.SetAttributes:设置文件属性 File.Exist:判断文件是否存在,40,9.3 File类,41,

34、9.3 File类,File.Open:文件打开 声明方式: Public static FileStream Open (string path,FileMode mode,FileAccess access) path用来指定要打开的文件路径 Mode是一个FileMode枚举类型,用于指定在文件不存在时是否创建该文件,并确定是保留还是改写现有文件的内容。 Access是一个FileAccess枚举类型,用于指定可以对文件执行的操作(只读、读写等)。,42,9.3 File类,FileAccess成员列表,Read 对文件的读访问。可从文件中读取数据。同 Write 组合即构成读写访问权。

35、 ReadWrite 对文件的读访问和写访问。可从文件读取数据和将数据写入文件。 Write 文件的写访问。可将数据写入文件。同 Read 组合即构成读/写访问权。,43,9.3 File类,FileMode成员列表,Append 打开现有文件并查找到文件尾,或创建新文件。FileMode.Append 只能同 FileAccess.Write 一起使用。任何读尝试都将失败并引发 ArgumentException。 Create 指定操作系统应创建新文件。如果文件已存在,它将被改写。这要求 FileIOPermissionAccess.Write。System.IO.FileMode.Cre

36、ate 等效于这样的请求:如果文件不存在,则使用 CreateNew;否则使用 Truncate。 CreateNew 指定操作系统应创建新文件。此操作需要 FileIOPermissionAccess.Write。如果文件已存在,则将引发 IOException。 Open 指定操作系统应打开现有文件。打开文件的能力取决于 FileAccess 所指定的值。如果该文件不存在,则引发 System.IO.FileNotFoundException。 OpenOrCreate 指定操作系统应打开文件(如果文件存在);否则,应创建新文件。如果用 FileAccess.Read 打开文件,则需要 F

37、ileIOPermissionAccess.Read。如果文件访问为 FileAccess.Write 或 FileAccess.ReadWrite,则需要 FileIOPermissionAccess.Write。如果文件访问为 FileAccess.Append,则需要 FileIOPermissionAccess.Append。 Truncate 指定操作系统应打开现有文件。文件一旦打开,就将被截断为零字节大小。此操作需要 FileIOPermissionAccess.Write。试图从使用 Truncate 打开的文件中进行读取将导致异常。,44,9.3 File类,File.Open

38、:文件打开 声明方式: Public static FileStream Open (string path,FileMode mode,FileAccess access) 通过File.Open()获取FileStream对象。 FileStream fs2 = File.Open (“C:Test2.dat”, FileMode.OpenOrCreate,FileAccess.ReadWrite); fs2.Close(); String rootpath = rootDir.FullName;,45,9.3 File类,File.Create:文件创建 private void Mak

39、eFile() FileStream fs2 = File.Create(“C:Test2.dat); fs2.close() 注意:由于File.Create方法默认向所有用户授权对新文件的完全读/写访问权限,所以文件是用读/写访问权限打开的,必须关闭后才能由其它,46,9.3 File类,File.Delete:文件删除 File. Delete(“C:Test2.dat); File.Copy:文件复制 File. Copy(“C:Test2.dat, “D:aaa.dat, true); /true用来指定如果目标文件已经存在是否覆盖 File.Move:文件移动 File. Move

40、(“C:Test2.dat, (“D:aaa.dat); /如果源文件和目标文件在同一个目录中,则相当于重命名文件。,47,9.3 File类,File.SetAttributes:设置文件属性 fileAttributes指定文件的属性,和DirectoryInfo中的Attributes是同一个属性集合,同样可以设置文件的只读、隐藏等属性。 File.SetAttributes(“C:Test2.dat“,FileAttributes.ReadOnly|FileAttributes.Hidden;),48,9.3 File类,File.Exist:判断文件是否存在 if (File.Exi

41、sts(path2) Console.WriteLine(The target already exists); else / Try to copy the file. File.Copy(path, path2); Console.WriteLine(0 was copied to 1., path, path2); ,FileInfo类不像File类,它不是静态的,没有静态方法,仅可用于实例化的对象。FileInfo对象表示磁盘或网络位置上的文件。提供文件的路径,就可以创建一个FileInfo对象: FileInfo f = new FileInfo(C:Test.dat); FileS

42、tream fs = f.Create(); 注意:FileInfo.Create()方法返回一个FileStream类型,FileStream能对基层的文件进行同步/异步的读写操作。需要知道的是,FileInfo.Create()返回的FileStream对象给所有的用户授予完全读写操作权限。,49,9.3 FileInfo类,FileInfo类的方法:,50,9.3 FileInfo类,51,9.3 FileInfo类,FileInfo.Open()方法 能使用FileInfo.Open()方法来打开现有文件,同样也能使用它来创建新文件,它比FileInfo.Create()多了很多细节。

43、一旦调用Open()完成后,它返回一个FileStream对象, FileInfo f2 = new FileInfo(C:Test2.dat); FileStream fs2 = f2.Open( FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None); / 使用FileStream对象。 fs2.Close(); / 关闭文件流。 第一个参数指定I/O请求的基本方式(比如说新建文件、打开现有文件和追加文件等),它的值由FileMode枚举指定. 第二个参数的值由FileAccess枚举定义,用来决定基层流的读写行为. 第三个

44、参数FileShare指定了文件在其他的文件处理程序中的共享方式,52,9.3 FileInfo类,FileInfo.OpenRead()和FileInfo.OpenWrite()方法 FileInfo.Open()方法能用非常灵活的方式获取文件句柄,FileInfo类同样提供了OpenRead()和OpenWrite()成员。这些方法不需要提供各种枚举值就能返回一个正确配置的只读或只写的FileStream类型。和FileInfo.Create()、FileInfo.Open()方法一样,FileInfo.OpenRead()和FileInfo.OpenWrite()也都返回一个FileSt

45、ream对象 / 得到一个只读的FileStream对象。 FileInfo f3 = new FileInfo(C:Test3.dat); FileStream readOnlyStream = f3.OpenRead(); / 使用FileStream对象 readOnlyStream.Close(); / 得到一个只写的FileStream对象。 FileInfo f4 = new FileInfo(C: Test4.dat); FileStream writeOnlyStream = f4.OpenWrite(); / 使用FileStream对象 writeOnlyStream.Cl

46、ose();,53,9.3 FileInfo类,FileInfo.OpenText()方法 FileInfo类型另外一个“Open”成员是OpenText()。和Create()、Open()、OpenRead()、OpenWrite()方法不同,OpenText()方法返回的是一个StreamReader类型的实例,而不是一个FileStream类型: / 得到一个StreamReader对象。 FileInfo f5 = new FileInfo(C:boot.ini); StreamReader sreader = f5.OpenText(); / 使用StreamReader对象 sr

47、eader.Close(); StreamReader类型提供了从基层文件读取字符数据的方法。,54,9.3 FileInfo类,FileInfo.CreateText()和FileInfo.AppendText()方法 最后需要指出的两个方法是CreateText()和AppendText(),它们都返回一个StreamWriter,代码如下: FileInfo f6 = new FileInfo(C:Test5.txt); StreamWriter swriter = f6.CreateText(); / 使用StreamWriter对象。 swriter.Close(); FileInf

48、o f7 = new FileInfo(C:FinalTest.txt); StreamWriter swriterAppend = f7.AppendText(); / 使用StreamWriter对象。 swriterAppend.Close(); StreamWriter类型提供向基层文件写入字符数据的方法。,FileInfo类的属性,55,9.3 FileInfo类,流的概念 一个用于传输数据的对象,数据的传输有两个方向,对应着两种类型的流: 输出流:用于将数据从程序传输到外部源。这里的外部源可以是物理磁盘文件、网络位置、打印机或另一个程序。 输入流:用于将数据从外部源传输到程序中。这

49、里的外部源有键盘、磁盘文件等。,56,9.4 读写文件,57,与流相关的类的层次结构,9.4 读写文件,对于文件的读写,最常用的类有以下几种: FileStream(文件流):这个类主要用于二进制文件中读写二进制数据,也可以用于读写任何文件。 StreamReader(流读取器)和StreamWriter(流写入器)和:这两个类专门用于读写文件。,58,9.4 读写文件,FileStream对象表示在磁盘或网络路径上指向文件的流。这个类提供了在文件中读写字节的方法,但经常使用StreamReader或StreamWriter执行这些功能。这是因为FileStream类操作的是字节和字节数组,而

50、Stream类操作的是字符数据。字符数据易于使用,但是有些操作,比如随机文件访问(访问文件中间某点的数据),就必须由FileStream对象执行,59,public FileStream ( string path, FileMode mode, FileAccess access, FileShare share );,FileStream的方法: 文件位置:FileStream.Seek 读取文件:FileStream.Read 写入数据:FileStream.Write,9.4.2 FileStream类,FileStream的构造函数: FileAccess默认为读写,60,9.4.2

51、 FileStream类,文件位置: FileStream.Seek方法: FileStream类维护内部文件指针,该指针指向文件中进行下一次读写操作的位置。在大多数情况下,当打开文件时,它就指向文件的开始位置,但是此指针可以修改。这允许应用程序在文件的任何位置读写,随机访问文件,或直接跳到文件的特定位置上。当处理大型文件时,这非常省时,因为马上可以定位到正确的位置。 实现此功能的方法是Seek()方法 public override long Seek ( long offset, SeekOrigin origin ) 它有两个参数:第一个参数规定文件指针以字节为单位的移动距离。第二个参数

52、规定开始计算的起始位置,用SeekOrigin枚举的一个值表示。Seek Origin枚举包含3个值:Begin、Current和End。,61,9.4.2 FileStream类,文件位置: FileStream.Seek方法: 例如,下面的代码行将文件指针移动到文件的第8个字节,其起始位置就是文件的第1个字节: aFile.Seek(8,SeekOrigin.Begin); 下面的代码行将指针从当前位置开始向前移动2个字节。如果在上面的代码行之后执行下面的代码,文件指针就指向文件的第10个字节: aFile.Seek(2,SeekOrigin.Current); 注意读写文件时,文件指针也

53、会改变。在读取了10个字节之后,文件指针就指向被读取的第10个字节之后的字节。 也可以规定负查找位置,这可以与SeekOrigin.End枚举值一起使用,查找靠近文件末端的位置。下面的代码会查找文件中倒数第5个字节: aFile.Seek(5, SeekOrigin.End); 以这种方式访问的文件有时称为随机访问文件,因为应用程序可以访问文件中的任何位置。稍后介绍的Stream类可以连续地访问文件,不允许以这种方式操作文件指针。,62,9.4.2 FileStream类,读取文件:FileStream.Read public override int Read ( InAttribute O

54、utAttribute byte array, int offset, int count ) 这个方法从文件中读取数据,再把数据写入一个字节数组。它有三个参数:第一个参数是传输进来的字节数组,用以接受FileStream对象中的数据。第二个参数是字节数组中开始写入数据的位置。它通常是0,表示从数组开端向文件中写入数据。最后一个参数指定从文件中读出多少字节。,63,9.4.2 FileStream类,读取文件:FileStream.Read 使用FileStream类读取数据不像使用本章后面介绍的StreamReader类读取数据那样容易。这是因为FileStream类只能处理只能处理二进制数

55、, 使得FileStream类可以用于任何数据文件,而不仅仅是文本文件。通过读取字节数据,FileStream对象可以用于读取图像和声音的文件。这种灵活性的代价是,不能使用FileStream类将数据直接读入字符串,而使用StreamReader类却可以这样处理。但是有几种转换类可以很容易地将字节数组转换为字符数组,或者进行相反的操作。比如字符: Decoder d = Encoding.UTF8.GetDecoder(); d.GetChars(byData, 0, byData.Length, charData, 0); 这些代码基于UTF8编码模式创建了Decoder对象。这就是Unic

56、ode编码模式。然后调用GetChars()方法,此方法提取字节数组,将它转换为字符数组。完成之后,就可以将字符数组输出到控制台。,64,9.4.2 FileStream类,写入数据:FileStream.Write 向随机访问文件中写入数据的过程与从中读取数据非常类似。首先需要创建一个字节数组;最简单的办法是首先构建要写入文件的字符数组。然后使用Encoder对象将其转换为字节数组,其用法非常类似于Decoder。最后调用Write()方法,将字节数组传送到文件中。 public override void Write ( byte array, int offset, int count ),使用FileStream类操作二进制数据比较麻烦,.NET Freamwork中提供了StreamWriter类和StreamReader类专门用来处理文本文件。 使用StreamWriter和StreamReader对象不能随意地改变文件指针的位置,只能顺序访问文件。,65,9.4.3 读写文本文件,StreamWtriter类允许将字符和字符串写入到文件中,它处理底层的转换,向FileStream对

温馨提示

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

评论

0/150

提交评论