filestream读取文件_2.11文件和流

文件和流我们经常会碰到这样的场景,比如需要打开一个文件夹,并选择文件夹下的某一个文件,这时候我们就需要进行文件的操作,在C#也已经提供了这样类专门负责文件的操作。File 类,这是一个静态类,用来提供一些文件操作的函数,其中就包含了:创建、拷贝、移动、删除和打开一个文件。使用File类,需要引用http://System.IO命名空间,基本有涉及到文件读写的都需要引用这个命名控件,IO的意思是Input和Output的缩写。

  • 创建文件

使用File.Ceate(string path)方法可以通过传入一个路径进行文件创建:File.Create(@"D:TestMyTest.txt");上述代码块在windows系统下的D盘创建了一个Test目录,并在改目录下创建了一个MyTest.txt的文本文件。符号@的作用是避免使用转义符。

  • 打开文件

使用File.Open(string path,FileMode)方法可以打开指定路径的文件。参数1是路径,参数二是文件模式:File.Open(@"D:TestMyTest.txt",FileMode.Append);FileMode是一个枚举,内部有6个值,其中:CreateNew,表示新建一个新的文件,如果文件不存在,则创建新文件,如果文件存在,则引发异常。Create,表示创建,如果文件存在,则覆盖,指针指向文件开始,更新创建时间,如果文件不存在,则新建文件。Open,表示打开文件,如果文件存在,则打开,指针指向文件开始,如果不存在则引发异常。OpenOrCreate,表示打开或者新建,如果文件存在,则打开文件,指针指向文件开始,如果不存在则新建。Truncate,表示如果文件存在,则打开文件,清除文件中的内容,指针指向文件开始,如果不存在则引发异常。Append,表示追加,如果文件存在,则打开,指针指向文件末尾,如果不存在,则新建文件。

  • 追加文件

使用File.AppendAllText(string path,string appendContent)方法来追加内容到末尾。第1个参数是文件路径,第2个参数是想要追加的内容。File.AppendAllText(@"D:TestMyTest.txt","我来了");

  • 复制文件

使用File.Copy(string sourcePath,string destPath,bool overwrite)方法进行文件复制,改方法有俩个重载方法,第1个参数为当前文件所在的路径,第2个参数则为目标路径,就是你想拷贝到哪里去,第3个参数则表示如果相同的文件是否覆盖。 File.Copy(@"D:TestMyTest.txt", @"E:TestMyTest.txt", true);上述代码尝试将D盘路径下的文件拷贝到E盘指定路径,如果存在同名文件则覆盖。

  • 移动文件

使用Move(string sourcePath,string destPaht)方法可以进行文件的移动。与复制方法类似。 File.Move(@"D:TestMyTest.txt", @"E:TestMyTest.txt");

  • 删除文件

使用Delete(string path)方法可以删除指定路径下的文件:File.Delete(@"D:TestMyTest.txt");

  • 文件检测

使用Exists(string paht)可以进行文件存在检测,这样可以避免一些文件不存在而导致的异常,这个判断返回一个bool值:if(File.Exites(@"D:TestMyTest.txt")){ Console.Write("文件不存在");}

  • 文件属性设置

使用SetAttributes(string path,FileAttributes)方法可以设置指定路径下的文件属性:只读、隐藏等。File.SetAttributes(@"D:TestMyTest.txt", FileAttributes.Hidden);FileAttributes也是一个枚举,内部基本涵盖了常用的文件属性:Archive 文件的存档状态。应用程序使用此属性为文件加上备份或移除标记。 Compressed 文件已压缩。 Device 保留供将来使用。 Directory 文件为一个目录。 Encrypted 该文件或目录是加密的。对于文件来说,表示文件中的所有数据都是加密的。对于目录来说,表示新创建的文件和目录在默认情况下是加密的。 Hidden 文件是隐藏的,因此没有包括在普通的目录列表中。 Normal 文件正常,没有设置其他的属性。此属性仅在单独使用时有效。 NotContentIndexed 操作系统的内容索引服务不会创建此文件的索引。 Offline 文件已脱机。文件数据不能立即供使用。 ReadOnly 文件为只读。 ReparsePoint 文件包含一个重新分析点,它是一个与文件或目录关联的用户定义的数据块。 SparseFile 文件为稀疏文件。稀疏文件一般是数据通常为零的大文件。 System 文件为系统文件。文件是操作系统的一部分或由操作系统以独占方式使用。 Temporary 文件是临时文件。文件系统试图将所有数据保留在内存中以便更快地访问,而不是将数据刷新回大容量存储器中。不再需要临时文件时,应用程序会立即将其删除。

Directory类和File类一样,也是一个静态类,只是这两个类的处理对象不一样,File是处理具体的某个文件,而Directory则处理的是高一层级的目录,也就是文件夹。C#中有提供Directory类和DirectoryInfo类用于目录操作。与File类似,Directory也提供了一系列创建、移动、删除、检测的方法,不过Directory在写路径的时候,不需要细化到文件,它关注的是文件夹的名称,我们通过写下面的例子来展现目录类的基本用法:Directory.CreateDirectory(@"D:Test");if(Directory.Exists(@"D:Test")){ Console.WriteLine("创建成功");}Directory.Delete(@"D:Test");if (!Directory.Exists(@"D:Test")){ Console.WriteLine("删除成功");}
DirectoryInfo dir = new DirectoryInfo(@"D:Test");if (!dir.Exists){ dir.Create();}else{ Console.WriteLine("该目录已经存在");}
流在.Net中,文件和流是两个概念,文件更多的是指存储到磁盘上的数据集,它有具体的路径和名称,可以被直接肉眼看得到,比如一张图片。而流则不仅仅是指打开的文件,还可以是一串网络数据,一串内存数据。流的基本操作,主要包括:Read :读取,将数据从流传输到某个数据结构中,比如将流输出到字符数组中。Write :写入,将数据从某个数据结构中传输到流中,比如将字节数组中的数据传输到流中。Seek:定位,在流中查找或者定位当前的位置。
操作流的类1. Stream类Stream类是所有流的抽象基类。Stream类的主要属性有:

64cb8d772407a2cd8a62ab28c660da50.png

主要方法有:

4d0b35e704bfdd8b611bce527d9a3f53.png

2. FileStream、MemoryStream和BufferedStream类 文件流类FileStream以流的形式读、写、打开、关闭文件。另外,它还可以用来操作诸如:管道、标准输入/输出等其他与文件相关的操作系统句柄。 内存流MemoryStream类用来在内存中创建流,以暂时保持数据,因此有了它就无须在硬盘上创建临时文件。它将数据封装为无符号的字节序列,可以直接进行读、写、查找操作。 缓冲流BufferedStream类表示把流先添加到缓冲区,再进行数据的读/写操作。缓冲区是存储区中用来缓存数据的字节块。使用缓冲区可以减少访问数据时对操作系统的调用次数,增强系统的读/写功能。 注意,FileStream类也有缓冲功能,可以在创建FileStream类的实例时,指定缓冲区的大小即可。3. StreamReader和StreamWriter类 流读取器StreamReader类用来以一种特定的编码(如:UTF-8)从字节流中读取字符,流写入器StreamWriter类用来以一种特定的编码(如:UTF-8)向流中写入字符。StreamReader和StreamWriter类一般用来操作文本文件。4. BinaryReader和BinaryWriter类 BinaryReader类用特定的编码将基元数据类型读作二进制。BinaryWriter类以二进制形式将基元类型写入流,并支持用特定的编码写入字符串。

文件流类 FileStream

文件流类FileStream公开了以文件为主的Stream,既支持同步读/写操作,也支持异步读/写操作,FileStream类的特点是操作字节和字节数组。这种方式不适合操作用字符数据构成的文本文件,适合处理非文本文件。FileStream类提供了对文件的低级而复杂的操作,因此能够实现更多高级的功能。 下面演示FileStreamWriter类的基本用法:
//要写入文件的字符数组

char[] m_cDataWrite = new char[100];

//包含要写入该流的数据的缓冲区

byte[] m_bDataWrite = new byte[100];

void FileStreamWriterTest(){

//创建D:TestTest.txt的FileStream对象

FileStream m_FileStream = new FileStream(@"D:TestTest.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();}}
代码中首先给出了文件夹的路径,利用Write方法向文件中写入部分字符串。 下面演示FileStreamReader类的基本用法:
//要写入文件的字符数组

char[] m_cDataWrite = new char[100];

//包含要写入该流的数据的缓冲区

byte[] m_bDataWrite = new byte[100];

void FileSteamReaderTest(){

//创建D:TestTest.txt的FileStream对象

FileStream m_FileStream = new FileStream(@"D:TestTest.txt", FileMode.Open);

//设置流当前位置为文件开始位置

m_FileStream.Seek(0, SeekOrigin.Begin);

//将文件的内容存到字节数组中(缓存)

m_FileStream.Read(m_bDataWrite, 0, 100);}

//通过UTF-8编码方法将字符数组转换成字符数组

void EncodeTest(){Decoder m_Dec = Encoding.UTF8.GetDecoder();

m_Dec.GetChars(m_bDataWrite, 0, m_bDataWrite.Length, m_cDataWrite, 0);

Console.WriteLine("Read from file Succeed!");Console.WriteLine(m_cDataWrite);}

代码中首先给出了文件夹的路径,利用Read方法从文件中读取了部分字符串。

StreamWriter和StreamReader类

应用FileStream类需要许多额外的数据类型转换操作,十分影响效率。StreamWriter类允许直接将字符和字符串写入文件。下面演示其用法:
void StreamWriterTest(){

//保留文件现有数据,以追加写入的方式打开D:TestTest.txt文件

StreamWriter m_SW = new StreamWriter(@"D:TestTest.txt", true);

//向文件写入新字符串,并关闭

StreamWriterm_SW.WriteLine("Another File Operation Method");

m_SW.Close();}

StreamReader类提供了另一种从文件中读取数据的方法,下面演示其用法:

void SteamReaderTest(){

//以绝对路径方式构造新的StreamReader对象

StreamReader m_SR = new StreamReader(@"D:TestTest.txt");

//用ReadToEnd方法将D:TestTest.txt中的数据全部读入到字符串m_Data中,并关闭StreamReaderstring m_Data = m_SR.ReadToEnd();m_SR.Close();

Console.WriteLine(m_Data);}

BinaryReader和BinaryWriter类

BinaryWriter类是除了FileStream和StreamWriter类之外另一种向文件写入数据的方式,与之前两种方式不同,BinaryWriter类将基础数据(如:字符串)以二进制形式写入文件流中,并支持用特定的编码写入。下面演示其用法:
void BinaryWriterTest(){FileStream m_FS = new FileStream(@"D:TestTest.dat", FileMode.Create);

//通过文件流创建相应的BinaryWriter

BinaryWriter m_BW = new BinaryWriter(m_FS);

for(int i = 0; i < 11; i++){

//向D:TestTest.dat中写入数据

m_BW.Write((int)i);}

m_BW.Close();m_FS.Close();}

代码中首先给出了文件夹的路径,利用BinaryWriter类的Write方法向文件中写入部分二进制字符。该文件是以二进制存储的,因此用记事本打开时,将无法观察到正确的字符,必须使用支持二进制的文本阅读器。 BinaryReader类是和BinaryWriter类相对应的二进制数据读取类。它用特定的编码将基元数据类型(如:字符串类型)读作二进制值。
void BinaryReaderTest(){

FileStream m_FS = new FileStream(@"D:TestTest.dat", FileMode.Open, FileAccess.Read);

//通过文件流创建相应的BinaryReader

BinaryReader m_BR = new BinaryReader(m_FS);

//从D:TestTest.dat中读取数据

for(int i = 0; i < 11; i++){Console.WriteLine(m_BR.ReadInt32());}

m_BR.Close();

m_FS.Close();

Console.ReadLine();}

代码中首先给出了文件夹的路径。利用BinaryReader类的ReadInt32方法从文件中读取了所有的二进制字符,并将其读为整数,便于输出。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值