文件
文件是一些具有永久存储及特定顺序的字节组成的一个有序的、具有名称的集合。
在各种介质上(可移动磁盘、硬盘、CD 等)存储的集合数据。
通常情况下文件按照树状目录进行组织,每个文件都有文件名、文件所在路径、创建时间、访问权限等属性。
流
流提供了连续的字节流存储空间,虽然数据实际存储的位置可能不连续,甚至可以分布在多个磁盘上,但我们看到的是封装以后的数据结构,是连续的字节流抽象结构。
除了和磁盘文件直接相关的文件流以外,流有多种类型,流可以分布在网络中,内存中或者是磁带中。
流的分类:
数据流向:输入流 输出流
读写单位:字节流 字符流
数据源:文件流 网络流 对象流(二进制流)
功能:结点流(原始流) 装饰流(过滤流)
IO 命名空间
包含便于在数据流和文件中读取和写入数据的类
IO 命名空间中用于文件目录操作类
System.IO命名空间下提供了三种操作目录的类:
Directory 静态类提供通过目录和子目录进行创建、移动和删除等静态方法。
DirectoryInfo 提供通过目录和子目录进行创建、移动和删除等实例方法。
Path 静态类的成员使您可以快速方便地对文件或目录路径信息的String实例,执行常见静态操作方法。例如:确定文件扩展名是否是路径的一部分,以及将两个字符串组合成一个路径名。
类 名 说明
File 提供用于创建、复制、删除、移动和打开文件的静态方法,
并协助创建 FileStream。FileInfo 类提供实例方法。
Directory 提供通过目录和子目录进行创建、移动和枚举的静态方法。
DirectoryInfo类提供实例方法
FileInfo 提供用于创建、复制、删除、移动和打开文件的实例方法,
并协助创建 FileStream。File 类提供静态方法。
DirectoryInfo 提供通过目录和子目录进行创建、移动和枚举的实例方法。
Directory 类提供静态方法。
FileSystemInfo FileInfo和DirectoryInfo的抽象基类。
Path 提供以跨平台的方式处理目录字符串的方法和属性。
DriveInfo 提供访问有关驱动器的信息的实例方法。
FileStream 支持通过其Seek方法随机访问文件。
默认情况下,FileStream 以同步方式打开文件,
但它也支持异步操作。File 包含静态方法,而FileInfo包含实例方法。
DeflateStream 提供使用Deflate算法压缩和解压缩流的方法和属性。
GZipStream 提供压缩和解压缩流的方法和属性。默认情况下,
此类使用与DeflateStream 类相同的算法,
但可以扩展到使用其他压缩格式。
BinaryReader 从Streams读取编码的字符串和基元数据类型。
BinaryWriter 或向Streams写入编码的字符串和基元数据类型。
StreamReader 通过使用Encoding进行字符和字节的转换,从Streams中读取字符。StreamReader具有一个构造函数,该构造函数根据是否存在专用于Encoding的preamble(例如一个字节顺序标记)来确定给定Stream的正确Encoding是什么。
StreamWriter 通过使用Encoding将字符转换为字节,向Streams写入字符。
StringReader 从Strings中读取字符。StringReader允许您用相同的API来处理Strings,因此您的输出可以是String或以任何编码表示的Stream。
StringWriter 向Strings写入字符。StringWriter允许您用相同的API来处理Strings,因此您的输出可以是String或以任何编码表示的Stream。
TextReader StreamReader和StringReader的抽象基类。抽象Stream类的实现用于字节输入和输出,而TextReader的实现用于Unicode字符输出
。
TextWriter StreamWriter和StringWriter的抽象基类。抽象Stream类的实现用于字节输入和输出,而TextWriter的实现用于Unicode字符输出。
BufferedStream 向另一个 Stream(例如 NetworkStream)添加缓冲的 Stream。(FileStream内部已具有缓冲,MemoryStream 不需要缓冲。)
BufferedStream 可以围绕某些类型的流来构成以提高读写性能。缓区是内存中的字节块,用于缓存数据,从而减少对操作系统的调用次数。
MemoryStream 一个非缓冲的流,可以在内存中直接访问它的封装数据。该流没有后备存储,可用作临时缓冲区。
NetworkStream 表示网络连接上的 Stream。虽然 NetworkStream 是从 Stream 派生的,但它不属于 System.IO 命名空间,而是在 System.NET.Sockets 命名空间中。
递归目录
如何获得某个盘符或者路径下的所有目录和子目录的信息呢?
using System;
using System.IO;
public class Files
{
//将string 改变为DirectoryInfo
public static void dispDirs(DirectoryInfo dir)
{
Console.WriteLine("{0}", dir.FullName);
//返回目录中的目录列表对象
DirectoryInfo[] directories = dir.GetDirectories();
foreach (DirectoryInfo dirX in directories)
{
dispDirs(dirX);
}
}
public static void Main(String[] args)
{
//保存目录存在
DirectoryInfo dir = new DirectoryInfo("D:\\TOOLS");
if (dir.Exists)
{
dispDirs(dir);
}
else
{
Console.WriteLine("访问目录不存在!");
}
Console.Read();
}
}
文件管理
File类通常和FileStream类协作来完成对文件的创建、删除、拷贝、移动、打开等操作。
File类提供的静态方法主要有Create、Copy、Move、Delete、GetLastAccessTime 等,利用它们可以完成一些基本的文件管理。
也可以通过FileInfo类来实现同样的操作。
字节流
Stream类提供以一种特定的编码从数据源头中读取字节。
FileStream类提供以一种特定的编码从文件中读取字节。
字节流的特点:
和数据源交互 直接获取数据源的字节数据
一般名称都是:XXXStream 全部都是Stream的子类
文件流获得:
通过File类中的Open、OpenRead、OpenWrite获得
通过构造的方式new出来
文件的读取和写入:
1 创建一个文件用于读写
2 产生文件字节流对象
3 Write\WriteByte写入
4 Read\ReadByte进行读取
字符流
StreamReader和StreamWriter类提供以一种特定的编码从字节流中读取字符。
字符流获得:
通过File类获取
使用构造new
注意:
文件的读取和写入
1 创建文件用于读写文本
2 产生字节流连接至文件
3 产生字符流连接至2产生的字节流
4 按行(ReadLine/WriteLine)按字符(Read\Write)读写文件即可
二进制流
BinaryReader 和BinaryWriter 类,用于按二进制模式读写文件。
它们提供的一些读写方法是对称的,比如针对不同的数据结构,BinaryReader提供了ReadByte、ReadBoolean、ReadInt、ReadInt16、ReadDouble、ReadString等方法,而BinaryWriter 则提供了重载了17次的Write 方法。
BinaryReader读取数据所用方法必须和BinaryWriter写入数据所用方法对应。