本节内容为文件操做git
文件操做在咱们C#里仍是比较常见的,例如咱们读取Excel、Txt文件的内容,在程序中,这些文件都是以流的方式读取进入咱们内存中,本节内容会详细的讲解有关文件的操做的方法。github
咱们从最大的驱动器开始往文件这个最小的开始讲解编程
在Windows操做系统中,存储介质统称为驱动器,硬盘因为能够划分为多个区域,每个区域称为一个驱动器。.NET提供DriveInfo类和 DriveType枚举型,以方便在程序中直接使用驱动器。DriveInfo类的经常使用字段成员有DriveFormat(文件系统格式,如NTFS或FAT32)、DriveType(驱动器类型)、Name(驱动器名)、TotalSize(总空间)、TotalFreeSpace(得到驱动器可用空间)。经常使用的方法成员有GetDrives(得到可用驱动器列表)。c#
DriveType枚举型的枚举值有CDRom(光驱)、Fixed(硬盘)、Network(网络驱动器)和Removeable(软盘或U盘)等。例如,如下代码能够输出每个硬盘驱动器的剩余空间信息。数组
DriveInfo[] drivers = DriveInfo.GetDrives(); foreach(DriveInfo driver in drivers) { if(driver.DriveType == DriveType.Fixed && driver.DriveFormat == "NTFS") { Console.WriteLine("在{0}驱动器上还有{1}字节的剩余空间。", driver.Name, driver.AvailableFreeSpace); } } Console.ReadLine();
为了方便检索文件,须要在驱动器中先建立目录,而后把文件保存到这个目录中。在Windows操做系统中,目录又称文件夹。每一个驱动器都有一个根目录,使用”\”表示,如”C:\”表示C驱动器的根目录。建立在根目录中的目录称为一级子目录。在一级子目录中建立的目录称为二级子目录,依此类推。文件系统的目录结构是一种树形结构。浏览器
.NET提供了Directory类和DirectoryInfo类,以方便在程序中直接操做目录。缓存
Directory类的经常使用方法成员有CreateDirectory(建立新目录)、Delete(删除目录)、Exists(判断目录是否存在)、Move(移动目录)、GetFiles(得到目录的文件列表)、GetDirectories(得到子目录列表)等。网络
DirectoryInfo类的经常使用字段成员有Name(提取目录名)、Exists(判断目录是否存在)、Parent(父目录)、Root(根目录)、MoveTo(移动目录)、GetFiles(得到目录的文件列表)、GetDirectories(得到子目录列表)等。例如,如下代码分别展示了Directory类和DirectoryInfo类的基本方法。数据结构
Directory.CreateDirectory(@"d:\C#程序设计"); if(Directory.Exists(@"d:\C#程序设计")) { Console.WriteLine("建立成功"); } Directory.Delete(@"d:\C#程序设计"); if (!Directory.Exists(@"d:\C#程序设计")) { Console.WriteLine("删除成功"); } DirectoryInfo dir = new DirectoryInfo(@"d:\C#程序设计"); if (!dir.Exists) { dir.Create(); } else { Console.WriteLine("该目录已经存在"); }
文件的操做主要是分为两个类,一个是File类,一个是FileInfo类。File和FileInfo类位于System.IO命名空间,均可以用来实现建立、复制、移动、打开文件等操做。File类和FileInfo类与Directory类和DirectoryInfo类的工做方式类似。File类是一个静态类,可直接调用其方法成员。FileInfo类不是静态类,须要先建立实例。异步
File类是一个文件的基本操做类,提供用于建立、复制、删除、移动和打开文件的静态方法,并协助建立 FileStream 对象。里面包含的大多都是实际操做文件的方法,我用一个列表表示它内部经常使用的方法
这些方法的使用也是很是简单,例如:
string path = @"E:\test.txt"; //以路径为参数建立文件 File.Create(path);
更多的使用你最好本身去尝试,咱们这几节的内容都是一些经常使用的类和方法的实际运用,并无过多的知识点,你只须要按着这里的操做一直尝试便可。
FileInfo类也能够对文件进行操做,文件信息类FileInfo与File类不一样,它虽然也提供类建立、复制、删除、移动和打开文件的方法,而且帮助建立FileStream对象,可是它提供的仅仅是实例方法他是咱们最经常使用的文件操做类。
它里面含有的属性有:
经常使用的方法和File类相似,这里添加几个以前没有讲过的
与文件类File和文件夹类Directory相比,文件信息类FileInfo和文件夹信息类DirectoryInfo具备其大部分功能。
文件流对咱们而言是一个陌生的概念,事实上,你仔细思考一下,咱们是如何经过File类和FileInfo类读取文件中的内容呢?它其实就是以文件流的形式进行读写。流包括如下基本操做:
在C#中,全部的流操做都继承于Stream类,Stream类的主要属性有
主要方法有
文件流类FileStream以流的形式读、写、打开、关闭文件。另外,它还能够用来操做诸如:管道、标准输入/输出等其余与文件相关的操做系统句柄。
内存流MemoryStream类用来在内存中建立流,以暂时保持数据,所以有了它就无须在硬盘上建立临时文件。它将数据封装为无符号的字节序列,能够直接进行读、写、查找操做。
缓冲流BufferedStream类表示把流先添加到缓冲区,再进行数据的读/写操做。缓冲区是存储区中用来缓存数据的字节块。使用缓冲区能够减小访问数据时对操做系统的调用次数,加强系统的读/写功能。
注意,FileStream类也有缓冲功能,在建立FileStream类的实例时,只须要指定缓冲区的大小便可。
示例
//要写入文件的字符数组 char[] m_cDataWrite = new char[100]; //包含要写入该流的数据的缓冲区 byte[] m_bDataWrite = new byte[100]; try { //建立d:\file.txt的FileStream对象 FileStream m_FileStream = new FileStream(@"d:\file.txt", FileMode.OpenOrCreate); //将要写入的字符串转换成字符数组 m_cDataWrite = "test filestream".ToCharArray(); //经过UTF-8编码方法将字符数组转成字节数组 Encoder m_Enc = Encoding.UTF8.GetEncoder(); m_Enc.GetBytes(m_cDataWrite, 0, m_cDataWrite.Length, m_bDataWrite, 0, true); //设置流当前位置为文件开始位置 m_FileStream.Seek(0, SeekOrigin.Begin); //将字节数组中的内容写入文件 m_FileStream.Write(m_bDataWrite, 0, m_bDataWrite.Length); if (m_FileStream != null) { //清除此流的缓冲区,使得全部缓冲的数据都写入到文件中 m_FileStream.Flush(); m_FileStream.Close(); } } catch (Exception ex) { Console.WriteLine("There is an IOException"); Console.WriteLine(ex.Message); } Console.WriteLine("Write to File Succeed!");
流读取器StreamReader类用来以一种特定的编码(如:UTF-8)从字节流中读取字符,流写入器StreamWriter类用来以一种特定的编码(如:UTF-8)向流中写入字符。StreamReader和StreamWriter类通常用来操做文本文件。
示例
try { //保留文件现有数据,以追加写入的方式打开d:\file.txt文件 StreamWriter m_SW = new StreamWriter(@"d:\file.txt", true); //向文件写入新字符串,并关闭StreamWriter m_SW.WriteLine("Another File Operation Method"); m_SW.Close(); } catch (Exception ex) { Console.WriteLine("There is an IOException"); Console.WriteLine(ex.Message); } StreamWriter类提供了另外一种从文件中读取数据的方法,下面演示其用法: try { //以绝对路径方式构造新的StreamReader对象 StreamReader m_SR = new StreamReader(@"d:\file.txt"); //用ReadToEnd方法将d:\file.txt中的数据所有读入到字符串m_Data中,并关闭StreamReader string m_Data = m_SR.ReadToEnd(); m_SR.Close(); Console.WriteLine(m_Data); } catch (Exception ex) { Console.WriteLine("There is an IOException"); Console.WriteLine(ex.Message); }
BinaryReader类用特定的编码将基元数据类型读做二进制。BinaryWriter类以二进制形式将基元类型写入流,并支持用特定的编码写入字符串。若是你须要查看写入的内容,你须要使用专门的二进制浏览器而不是记事本
示例
FileStream m_FS = new FileStream(@"d:\data.dat", FileMode.Create); //经过文件流建立相应的BinaryWriter BinaryWriter m_BW = new BinaryWriter(m_FS); for(int i = 0; i < 11; i++) { //向d:\data.dat中写入数据 m_BW.Write((int)i); } m_BW.Close(); m_FS.Close(); FileStream m_FS = new FileStream(@"d:\data.dat", FileMode.Open, FileAccess.Read); //经过文件流建立相应的BinaryReader BinaryReader m_BR = new BinaryReader(m_FS); //从d:\data.dat中读取数据 for(int i = 0; i < 11; i++) { Console.WriteLine(m_BR.ReadInt32()); } m_BR.Close(); m_FS.Close(); Console.ReadLine();
《c# 编程兵书》第11章 张志强 胡君 编著
若是个人文章帮助了您,请您在github.NETCoreGuide项目帮我点一个star,在博客园中点一个关注和推荐。