C#文件输入输出

  • 文件
    是一个存储在磁盘中带有指定名称和目录路径的数据集合。当用程序打开文件进行读写时,它就变成了一个流。


  • 流,通过通信路径传递的字节序列
    有两个主要的流:输入流、输出流
    输入流:用于从文件中读取数据(读操作),输入到程序当中
    输出流:用于向文件写数据(写操作),从程序输出到文件

  • C#中的I/O类
    System.IO命名空间中有各种不同的类,分别用于执行文件操作
    BirnaryReader:从二进制流取原始数据
    BrinaryWriter:以二进制格式写入原始数据
    BufferedStrean:字节流的缓冲存储
    Directory:用来进行目录结构的操作
    DirectoryInfo:用于目录执行操作
    DriveInfo:提供驱动器信息
    File:用来进行文件处理
    FileInfo:用于文件执行操作
    FileStream:用于文件中任何位置的读写
    MemoryStream:用于随机访问存储在内存中的数据流
    Path:对路径信息的执行操作
    StreamReader:用于从字节流中读取字符
    StreamWriter:用于向一个流中写入字符
    StringReader:用于读取字符串缓冲区
    StringWriter:用于写入字符串缓冲区

  • FileStream类
    System.IO命名空间中的FileStream类用来做文件的读写与关闭,这个类派生自Stream。
    创建FileStream对象的语法
    FileStream <object_name> = new FileSteam(< file_name >,< FileMode Enumerator >,< FileAccess Enumerator >,< FileShare Enumerato >);
    实例:
    FileStream F = new FileStream(“1.txt”,FileMode.Open,FileAccess.Read,FileShare.Read);
    上面的实例是用来创建一个FileStream对象F来读取名为1.txt文件。

相关参数说明:
FileMode:枚举定义了各种打开文件的方法
Append:打开一个已有文件,并把光标置为文件的未尾,如果文件不存在则创建文件
Create:创建一个新的文件,如果文件已存在则删除旧文件并创建新文件
CreateNew:创建一个新文件,如果文件已存在,则会抛出一个异常
Open:打开一个已有文件,如果文件不存在则抛出异常
OpenOrCreate:打开一个已有文件,如果文件不存在,则用指定名称创建一个新的文件打开
Truncate:打开一个已有文件,文件一打开就会被截断为0字节的大小,我们可以向文件写入全新的数据,但是保留文件初始创建的日期,如果文件不存在则抛出异常

FileAccess:枚举的成员有Read,ReadWrite,Write

FileShare
Inheritable:允许文件的包柄可以由子进程继承,Win32不直接支持这个功能
None:不共享当前文件,文件关闭关,打开这个文件的任何请求都会失败
Read:允许随后打开文件读取。如果不指定这个标志,则文件关闭前,任何打开文件以进行读取请求都会失败。注意:就算是指定了这个标志,仍可能需要附加的权限才可以访问这个文件
ReadWrite:允许随后打开文件进行读取或写入。如果不指定这个标志,则文件关闭前,任何打开文件以进行读取或写入的请求都会失败。注意:就算是指定了这个标志,仍可能需要附加权限才可以访问这个文件
Write:允许随后打开文件写入,如果未指定这个标志,则文件关闭前,任何打开文件以请志写入都会失败。注意就算是指定了这个标志,仍可能需要附加权限才可以访问这个文件
Delete:允许随后删除文件

使用Visual Studio新建C#控制台应用程序chapter20_001
在项目中新增一个文件夹Files,在文件夹下新建一个test.dat文件,其内容为Hello C#!并以UTF8的格式保存文件
在项目生成的Main方法中加入如下代码进行测试:

 //创建一个文件读写的对象(FileStream类对象)
FileStream f = new FileStream("..\\..\\Files\\test.dat",FileMode.OpenOrCreate,
FileAccess.ReadWrite);
byte[] array = new byte[1024];
int i = f.Read(array, 1, 1000);
//把读取到的数据转为字符串(按UTF8的格式转换)
string str = System.Text.Encoding.UTF8.GetString(array);
Console.WriteLine("读取到文件的内容如下:\n" + str);
f.Close();
Console.ReadKey();

注意:使用到了文件读取类需要在源文件中using对应的命名空间
using System.IO;
编译运行结果如下:

  • C#文本文件的读写
    StreamReader和StreaWriter类适用于文本文件的读写,这些类是从抽象基类Stream继承来的,Stream支持文件流的字节读写。

  • StreamReader类
    它继承自抽象基类TextReader,表示读取一系列的字符。
    StreamReader类中常用方法:
    1.public override void Close()
    关闭StreamReader对象和基础流,并释放任何与读者相关的系统资源
    2.public override int Peek()
    返回下一个可用的字符,但不使用它
    3.public override int Read()
    从输入流中读取下一个字符,并把字符位置往前移一个字符
    现test.dat同一目录新建一个文本文件demo.txt
    文本文件中内容如下:
    金庸(1924年3月10日—2018年10月30日),原名查良镛,生于浙江省嘉兴市海宁市,1948年移居香港。当代武侠小说作家、新闻学家、企业家、政治评论家、社会活动家,“香港四大才子”之一。
    1944年考入重庆中央政治大学外交系。1946年秋,金庸进入上海《大公报》任国际电讯翻译。1948年,毕业于上海东吴大学法学院。1952年调入《新晚报》编辑副刊,并写出《绝代佳人》、《兰花花》等电影剧本。1959年,金庸等人于香港创办《明报》。
    1985年起,历任香港特别行政区基本法起草委员会委员、政治体制小组负责人之一,基本法咨询委员会执行委员会委员,以及香港特别行政区筹备委员会委员。2000年,获得大紫荆勋章。2009年9月,被聘为中国作协第七届全国委员会名誉副主席。同年荣获2008影响世界华人终身成就奖。2010年,获得剑桥大学哲学博士学位。
    2018年10月30日,金庸在香港逝世,享年94岁。

在Main方法中加入如下代码进行测试使用StreamReader进行读取操作

           //使用StreamReader来读取Console.WriteLine("-------------使用StreamReader来读取-------------");try{using (StreamReader sr = new StreamReader("..\\..\\Files\\demo.txt")){string line;//从文件读取并显示,直到文件的未尾while ((line = sr.ReadLine()) != null){Console.WriteLine(line);}}}catch (Exception e){//读取出现异常Console.WriteLine("文件内容读取失败!");Console.WriteLine(e.Message);}

编译运行后的结果如下:

  • StreamWriter类
    StreamWriter类继承自抽象类TextWriter,标识写入一系列字符
    StreamWriter类常用方法:
    1.public override void close()
    关闭当前的StreamWriter对象和基础流
    2.public override void Flush()
    清理当前编写器的所有缓冲区,把所有缓冲区中数据写入基础流
    3.public virtual void Write(bool value) 此继承自TextWriter
    把一个布尔值的文本表示形式写入到文本字符串或流
    4.public override void Write(char value)
    把一个字符写入到流
    5.public virtual void Write(decimal value)
    把一个十进制值的文本表示形式写入到文本字符串或流
    6.public virtual void Write(double value)
    把一个8字节浮点值的文本表示形式写入到文本字符串或流
    7.public virtual void Write(int value)
    把一个4字节有符号整数的文本表示形式写入到文本字符串或流
    8.public override void Write(string value)
    把一个字符串写入到流
    9.public virtual void WriteLine()
    把行结束符写入到文本字符串或流

在Main方法中加入如下代码进行测试:

//向文件中写入Console.WriteLine("-----------向文件中写入--------------");string write_str = "金庸武侠小说是20世纪中国文学史上无可比肩的畅销书,其在征服了无数读者的同时也掀起学术界对其进行研究的热潮。在21世纪,对金庸武侠小说进行深入的探究和挖掘,追问其广泛流行的根源,阐述和归纳其特有的艺术特征,正确评价金庸武侠小说的艺术特征,把握当下文坛的创作及评价趋向,都有一定的理论意义和现实意义。金庸武侠小说之所以流行,主要原因是它对传统武侠小说的升华和超越。";using (StreamWriter sw = new StreamWriter("..\\..\\Files\\demo.txt",true)){sw.WriteLine();sw.Write(write_str);sw.Flush();sw.Close();}Console.WriteLine("写入执行完成!!!");//写入完成后读出写入后的结果Console.WriteLine("--------------写入后读取的结果--------------");string read = "";using (StreamReader sr = new StreamReader("..\\..\\Files\\demo.txt")){while ((read = sr.ReadLine()) != null){Console.WriteLine(read);}}

编译运行结果如下:

  • C#二进制文件读写
    BinaryReader和BinaryWriter类用于二进制文件读写

  • BinaryReader类
    这个类用于从文件中读取二进制数据,一个BinaryReader对象通过向它的构造函数传递FileStream对象而被创建。
    BinaryReader类常用方法
    1.public override void Close()
    关闭BinaryReader对象和基础流
    2.public virtual int Read()
    从基础流中读取字符,并把流的当前位置往前移
    3.public virtual bool ReadBoolean()
    从当前流中读取一个布尔值,并把流的当前位置往前移一个字节
    4.publican virtual byte ReadByte()
    从当前流中读取下一个字节,并把流的当前位置往前移一个字节
    5.public virtual byte[] ReadBytes(int count)
    从当前流中读取指定数目的字节到一个字节数组中,并把流的当前位置往前移指定数目字节
    6.public virtual char ReadChar()
    从当前流中读取下一字节,并把流的当前位置按照所使用的编码从流中读取的指定的字符往前移
    7.public virtual char[] ReadChars(int count)
    从当前流中读取指定数目的字节,在一个字符数组中返回数组,并把流的当前位置按照所使用的编码和从流中读取的指定的字符往前多
    8.public virtual double ReadDouble()
    从当前流中读取一个8字节浮点值,并把流的当前位置往前移8个字节
    9.public virtual int ReadInt32()
    从当前流中读取一个4字节的有符号整数,并把流的当前位置往前移4个字节
    10.public virtual string ReadString()
    从当前流中读取一个字符串。字符串以长度作为前缀,同时编码为一个7位的整数

  • BinaryWriter类
    用于向文件写入二进制数据,一个BinaryWriter对象通过向它的构造函数传递FileStream对象而被创建。
    BinaryWriter类常用方法
    1.public override void Close()
    关闭BinaryWriter对象和基础流
    2.public virtual void Flush()
    清理当前编写器的所有缓冲区,使得所有缓冲区数据写入基础设备
    3.public virtual long Seek(int offset,SeekOrigin origin)
    设置当前流内的位置
    4.public virtual void Write(bool value)
    把一个单字节的布尔值写入到当前流中,0表示false,1表示true
    5.public virtual void Write(byte value)
    把一个无符号字节写入到当前流中,并把流的位置往前移一个字节
    6.public virtual void Write(byte[] buffer)
    把一个字节数组写入到基础流中
    7.public virtual void Write(char ch)
    把一个Unicode字符写入到当前流中,并把流的当前位置按照所使用的的编码和要写入到流中的指定的字符往前移
    8.public virtual void Write(char[] chars)
    把一个字符数组写入到当前流中,并把流的当前位置按照所使用的编码和要写入的流中的指定的字符往前移
    9.public virtual void Write(double value)
    把一个8字节浮点值写入到当前流中,并把流位置往前移8个字节
    10.public virtual void Write(int value)
    把一个4字节有符号整数写入到当前流中,并把流位置往前移4个字节
    11.public virtual void Write(string value)
    把一个以长度为前缀的字符串写入到BinaryWriter的当前编码的流中,并把流的当前位置按照所使用的编码和要写入到流中的指定的字符往前移

使用Visula Studio新增C#控制台应用程序chapter20_002
在Main方法中新增如下测试代码如下:

BinaryWriter bw;BinaryReader br;int i = 100;double d = 3.1415926;bool b = true;string s = "Hell C#";//创建一个文件try{bw = new BinaryWriter(new FileStream("..\\..\\data.dat", FileMode.Create));bw.Close();}catch (IOException e){Console.WriteLine("error:" + e.Message);}//写入文件try{bw = new BinaryWriter(new FileStream("..\\..\\data.dat",FileMode.Open));bw.Write(i);bw.Write(d);bw.Write(b);bw.Write(s);bw.Flush();bw.Close();}catch (IOException e){Console.WriteLine("error:" + e.Message);}//读取文件内容try{br = new BinaryReader(new FileStream("..\\..\\data.dat", FileMode.Open));Console.WriteLine("int:{0}", br.ReadInt32());Console.WriteLine("double:{0}", br.ReadDouble());Console.WriteLine("bool:{0}", br.ReadBoolean());Console.WriteLine("string:{0}",br.ReadString());br.Close();}catch (IOException e){Console.WriteLine("error:" + e.Message);}Console.ReadKey();

编译运结果如下:

  • C# Windows文件系统操作
    C#允许使用各种目录和文件相关的类来操作目录和文件。
  • DirectoryInfo类
    派生自FileSystemInfo类。它提供了各种用于创建、移动、浏览目录和子目录的方法
    DirectoryInfo类的常用属性:
    1.Attributes
    获取当前文件或目录的属性
    2.CreationTime
    获取当前文件或目录的创建时间
    3.Exists
    获取一个表示目录是否存在的布尔值
    4.Extension
    获取表示文件扩展名部分的字符串
    5.FullName
    获取目录或文件的完整路径
    6.LastAccessTime
    获取当前文件或目录最后被访问的时间
    7.Name
    获取该DirectoryInfo实例的名称

DirectoryInfo类中的常用方法:
1.public void Create()
创建一个目录
2.public DirectoryInfo CreateSubdirectory(stirng path)
在指定的路径上创建子目录,指定的路径可以是相对于DirectoryInfo类的实例路径。
3.public override void Delete()
如果为空的,则删除这个DirectoryInfo
4.public DirectoryInfo[] GetDirectories()
返回当前目录的子目录
5.public FileInfo[] GetFiles()
从当前目录返回文件列表

  • FileInfo类
    派生自FileSystemInfo类。它提供了用于创建、复制、删除、移动、打开文件的属性和方法。
    FileInfo常用属性
    1.Attributes
    获取当前文件的属性
    2.CreationTime
    获取当前文件的创建时间
    3.Directory
    获取文件所属目录的一个实例
    4.Exists
    获取一个表示文件是否存在的布尔值
    5.Extension
    获取文件扩展名字符串
    6.FullName
    获取文件的完整路径
    7.LastAccessTime
    获取当前文件最后被 访问的时间
    8.LastWriteTime
    获取文件最后被 写入的时间
    9.Length
    获取当前文件的大小,以字节为单位
    10.Name
    获取文件名称

FileInfo类常用方法
1.public StreamWriter AppendText()
创建一个StreamWriter,追加文本到由FileInfo的实例表示的文件中
2.public FileStream Create()
创建一个文件
3.public override void Delete()
永久删除一个文件
4.public void MoveTo(String destFileName)
移动一个文件到一个新的位置,可以提供新的文件名称
5.public FileStream Open(FileMode mode)
以指定的模式来打开一个文件
6.public FileStream Open(FileMode mode,FileAccess access)
以指定的模式来打开一个文件,使用read,write或read/write访问,来打开一个文件
7.public FileStream Open(FileMode mode,FileAccess access FileShare share)
以指定的模式,使用read,write或read/write访问,以及指定的分享选项,来打开一个文件
8.public FileStream OpenRead()
创建一个只读的FileStream
9.public FileStream OpenWrite()
创建一个只写的FileStream

在Main方法中添加如下代码测试读取目录和文件信息:

//使用DriectoryInfo、FileInfo读取目录和文件的相关信息DirectoryInfo dir = new DirectoryInfo(@"E:\C#\project\chapter20_002\chapter20_002");Console.WriteLine(@"-------------------获取目录E:\C#\project\chapter20_002\chapter20_002下的所有文件------------------");//获取目录中的文件以及其名称和大小FileInfo[] f = dir.GetFiles();foreach (FileInfo file in f){Console.WriteLine("File name:{0} Size:{1}",file.Name, file.Length);}

编译运行后结果如下

C#每日一课(二十五)相关推荐

  1. 智课雅思词汇---二十五、形容词后缀-ate-fic-ose-ulent-olent-ous-ulous-y

    智课雅思词汇---二十五.形容词后缀-ate-fic-ose-ulent-olent-ous-ulous-y 一.总结 一句话总结: 1.形容词后缀-ate(determinate)? determi ...

  2. 刘东明微信营销二十五式初探(一)

    中国电子商协会PCEM网络整合营销研究中心主任 刘东明 北京航空航天大学研究生 杨晓燕 李怀林 高骏杰 微信火了,意料之中!从2011年1月21日第一版本发布,如今微信用户即将突破4亿大关. 放眼中国 ...

  3. 渗透测试-地基钓鱼篇-Cobalt Strike钓鱼(二十五)

    ** 渗透测试-地基钓鱼篇-Cobalt Strike钓鱼(二十五) ** 作者:大余 时间:2020-12-17 简介: 渗透测试-地基篇: 该篇章目的是重新牢固地基,加强每日训练操作的笔记,在记录 ...

  4. 2021年大数据Hadoop(二十五):YARN通俗介绍和基本架构

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 YARN通俗介绍和基本架构 Yarn通俗介绍 Yarn基本 ...

  5. VMware vSphere 服务器虚拟化之二十五 桌面虚拟化之终端服务池

    VMware vSphere 服务器虚拟化之二十五 桌面虚拟化之终端服务池 终端服务池是指由一台或多台微软终端服务器提供服务的桌面源组成的池.终端服务器桌面源可交付多个桌面.它具有以下特征: 1.终端 ...

  6. 未处理异常和C++异常——Windows核心编程学习手札之二十五

    未处理异常和C++异常 --Windows核心编程学习手札之二十五 当一个异常过滤器返回EXCEPTION_CONTINUE_SEARCH标识符时是告诉系统继续上溯调用树,寻找另外的异常过滤器,但当每 ...

  7. linux exec 二程序,二十五、Linux 进程与信号---exec函数

    25.1 介绍 在用 fork 函数创建子进程后,子进程往往要调用一种 exec 函数以执行另一个程序 当进程调用一种 exec 函数时,该进程完全由新程序代换,替换原有进程的正文,而新程序则从其 m ...

  8. 二十五、求单点的最短路径

    二十五.求单点的最短路径 文章目录 二十五.求单点的最短路径 题目描述 解题思路 上机代码 题目描述 求从指定源点出发到各个顶点的最短路径. **假设:**图中结点名均为单个互不相同的字母,权值均&g ...

  9. Python之精心整理的二十五个文本提取及NLP相关的处理案例

    一.提取 PDF 内容 # pip install PyPDF2 安装 PyPDF2 import PyPDF2 from PyPDF2 import PdfFileReader# Creating ...

最新文章

  1. Underscore实例教程
  2. 计算两个字符串之间是否包含的简单方法
  3. java8中Optional的使用
  4. Excel 打开csv显示在一个单元格
  5. 面试中Handler这些必备知识点你都知道吗?面试真题解析
  6. 18-Gm-TransH:Group-Constrained Embedding of Multi-fold Relations in Knowledge Bases,嵌入,transH,n-ary
  7. wordpress 通过域名无法访问_VPS主机和宝塔面板搭建WordPress网站教程
  8. 前端模板技术的全面总结
  9. 云免流控服务器响应失败,云免流服务器是否违法
  10. php入门第二篇---变量
  11. 思维导图c语言java区别_C语言基本数据类型的思维导图
  12. U盘启动盘制作(步骤详细)
  13. 树莓派WIFI配置遇到的坑 之 连接不上WIFI
  14. Java基础教程-刘刚-专题视频课程
  15. 教师资格初中计算机说课,初中教师资格证说课稿
  16. asp.net DES加密解密
  17. HTML绘制交互图,基于 HTML5 Canvas 的交互式地铁线路图
  18. 测试手机视频录屏并转GIF功能
  19. OpenCV标定板制作工具
  20. 计算机二级Python学习笔记(七)

热门文章

  1. java反射效率问题_Java反射到底慢在哪?
  2. 波卡的验证人节点_轻松节点身份验证:设置和本地
  3. vue node_modules复制到内网环境
  4. 404网站服务器错误怎么解决方法,网页404状态码应该怎么处理
  5. c#随机生成IP地址
  6. PyQt4学习4之---采用Qt Designer拖动创建计算器界面
  7. 手游盒子平台搭建流程
  8. JAVA爬虫案例——JSOUP爬取图片并使用v-viewer实现图片预览
  9. mysql中清空数据库数据保留表结构(史上最简单,一句话搞掉)
  10. SuperMap GIS平台软件在信创环境部署QA