1、目的
若自己编写程序玩玩,需要持久化数据,使用System.IO.Stream派生类持久化数据是一个不错的选择。另外,在WCF技术中,数据传递至远程计算机就需要将数据/对象序列化,因此,将System.IO及序列化的信息记录如下。
2、概况
System.IO中大多数成员包含在mscorlib.dll中,另外有一部分在System.dll中。其主要的功能是提供读/写文件、目录等的功能。以下为System.IO命名空间中的概况。
类 | 说明 |
BinaryReader和BinaryWriter | 能够以二进制的形式读取和存储数据 |
BufferedStream | 给另一流上的读写操作添加一个缓冲层。无法继承此类。 |
Directory和DirectoryInfo | 两者都是用于操作目录,区别在于: Directory: public static class Directory DirectoryInfo: public sealed class DirectoryInfo: FileSystemInfo 即,1、Directory是一个静态类,可以直接调用方法完成操作,DirectoryInfo是“正常”类,需要创建一个DirectoryInfo对象,才能使用操作文件夹的方法。 2、两者均不可被继承。 |
DriveInfo | 提供驱动器的信息访问 |
File和FileInfo | 两者都是对文件进行操作,区别可以参考Directory和DirectoryInfo的区别。 |
FileStream | 以操作文件为主的Stream,既支持同步读写操作,也支持异步读写操作。 |
FileSystemInfo | 是FileInfo和DirectoryInfo的基类 |
FileSystemWatcher | 侦听文件的更改,并在更改时引发事件 |
Path | 路径类,其对包含文件或目录信息的string字符串进行操作。跨平台 |
Stream | |
StreamReader/StreamWriter | 按照一定的编码方式,以字节(byte)流的方式,操作文本信息 |
StringReader/StringWriter | StringReader:从字符串中读取数据 StringWriter:向字符串中写入数据,该数据存储于StringBuilder中。 |
TextReader/TextWriter | 抽象类,是StringReader/Writer、StreamReader/Writer的父类 |
UnmanagedMemoryAccessor | 提供从托管代码中随机访问非托管内存块的能力 |
UnmanagedMenoryStream | 提供托管代码访问非托管内存块的能力 |
表1 .NET的System.IO命名空间的概述
3、Directory(Info)&File(Info)
Directory(Info)与File(Info)可以实现对计算机中文件和目录的操作。不同的是Directory和File是abstract类,可以直接调用其方法;Info的两个是需要new出来使用的。
以下为4者UML关联图
FileSystemInfo抽象类是一个全能奶爸,因为他是FileInfo(操作文件的类)和DirectoryInfo(操作路径的类)的父类,即,其必须包含:操作文件和路径的方法,文物双全!
3.1 FileSystemInfo抽象类
用于对文件或文件夹的操作。
其继承类,在第一次调用时会调用refresh()方法,获得文件或文件夹的特性,因此若想获得文件/文件夹的最新信息,需要调用refresh()方法。
FileSystemInfo的属性
属性 | 说明 |
Attributes | 是指当前的对象为文件还是文件夹,File还是Directory |
CreationTime | 创建时间 |
Exists | 是否存在(bool) |
Extension | 扩展名(string) |
FullName | 完整目录 |
LastAccessTime | 上次访问的时间 |
LastWriteTime | 上次写入时间 |
Name | 对于文件:获得文件名称 对于目录:或得最后层次的文件夹名称 |
表2 FileSystemInfo属性
FileSystemInfo的方法
方法为:Delete()、Refresh()方法,其他方法继承自Object或MarshallByRefObject
4、DirectoryInfo类
4.1、构造函数
DirectoryInfo类只有一个构造函数,如下
public DirectoryInfo(string path)
path不能为null,否则会报:ArgumentNullException异常
path可以为 ”.” ,表示当前应用程序的目录
4.2、属性
DirectoryInfo的属性比父类(FileSystemInfo)的属性多了2个。
属性 | 说明 |
Parent | 获得上一级目录 |
Root | 获得根目录 |
4.3、方法
返回类型 | 方法名称 | 备注 | |
public | void | Create() | 创建目录,若已经存在则不作任何操作 |
public | DirectionaryInfo | CreateSubdirectory(string path) | 创建一个或多个子目录,并返回最后一个目录的DirectoryInfo实例。 一个子目录:CreateSubdirectory(“test”); 多个:CreateSubdirectory(@”c:\test\test1\test2\test3”);创建了test1、test2、test3三个子目录,且当前的directoryInfo为test3所对应的对象 (2)、path不得为磁盘名称或UNC。 即不允许为“c:\directoryName\fileName”或 “file:\\server\project file.mpp” |
public | void | Delete() | DirectoryInfo类中的Delete()方法已经完成重写。若DirectoryInfo为空,则完成删除,若删除非空的DirectoryInfo,则会报错。删除DirectoryInfo全部信息,需要使用Delete()的重载方法。 |
public | void | Delete(bool recursive) | 确定是否删除子目录和文件 true:删除此目录、子目录及文件 false:=delete() |
public | DirectoryInfo[] | GetDirectories() | 返回当前目录下所有子目录的DirectoryInfo数组。 |
public | DirectoryInfo[] | GetDirectories(string searchPattern) | 按某种搜索条件查找加过。例如:*p*,查找文件夹名称包含p的。 |
public | DirectoryInfo[] | GetDirectories( string searchPattern, SearchOption searchOption) | SearchOption : TopDirectoryOnly:只查找当前目录 AllDirectories: 查找当前目录及子目录 |
public | FileInfo[] | GetFiles() | 返回当前目录的文件列表 |
public | FileInfo[] | GetFiles(string searchPattern); GetFiles( string searchPattern, SearchOption searchOption ) | 类比GerDirectories()方法 |
public | void | MoveTo(string destDirName) | 将DirectoryInfo对象移动到指定的新路径 |
5、Directory类
5.1 Directory类是静态类
public static class Directory
5.2 Directory类中只有方法,方法全部为static类型。没有属性--必然的,若有属性,则是鸡肋。
类型 | 返回值 | 方法名称 | 备注 |
public | DirectoryInfo | CreateDirectory(string path ) | 创建目录子目录 |
public | void | Delete(string path) | 从指定路径中删除空目录 |
public | void | Delete(stirng path, bool recursive ) | 同DirectoryInfo中Delete(bool recursive) 为true:删除指定目录的全部内容 为false:=Delete(string path) |
public | bool | Exists(string path) | 判断指定的路径是否存在 |
public | DateTime | GetCreationTime(string path) | |
public | string | GetCurrentDirectory() | 返回应用程序的当前路径 |
public | string[] | GetDirectories(string path) | 返回指定路径下所有子目录 |
GetDirectories( string path, string searchPattern ) | 从指定某路径的子目录中,按某条件(正则表达式)返回所有结果 | ||
public | string[] | GetFiles(string path) | 返回指定路径的所有的文件名称 |
GetFiles( string path, string searchPattern ) | |||
GetFiles( string path, string serachPattern, SearchOption searchOption ) | searchOption: TopDirectoryOnly 仅在当前目录 AllDirectories 当前目录及子目录 |
6、DriveInfo类
6.1 DriveInfo类提供了驱动器信息
public sealed class DriveInfo : ISerializable
6.2 属性、方法
名称 | 说明 | |
long | AvailableFreeSpace{ get; } | 可用空间 |
string | DriveFormat { get; } | 驱动器类型 FAT32还是NTFS |
DriveType | DriveType { get; } | |
bool | IsReady { get; } | 是否准备好 |
string | Name { get; } | 驱动器名称 |
DirectoryInfo | RootDirectory { get; } | 根目录驱动 |
string | VolumeLabel { get; set; } | 驱动器卷标 |
方法
public static DriveInfo[] GetDrives() //获得所有驱动器的驱动名称
7、FileInfo类
7.1 构造器
public FileInfo( string fileName ) //fileName不可为null
7.2 属性
类型 | 返回值 | 属性名称 | 说明 |
public | DirectoryInfo | Directory { get; } | 获取父目录的DirectoryInfo对象 |
string | DirectoryName {get;} | 返回完整目录 | |
bool | Exists(string path) | 是否存在 | |
string | extension | 扩展名 | |
long | length | 文件大小 | |
string | name | 文件名称 | |
bool | isReadOnly | 获取/设定只读属性 |
7.3 方法
返回值 | 方法名称 | 说明 | |
StreamWriter | AppendText() | 返回一个StreamWriter,用于写入数据 | |
StreamWriter | CreateText() | 同上 | |
FileInfo | CopyTo(string destFileName) | 将当前文件内容复制到指定文件中。若文件已经存在,则报:IOException异常,e.message信息为:文件“XX”已经存在 | |
FileInfo | CopyTo( string destFileName, bool overwrite ) | 同上,不过overwrite =true,则允许覆盖现有文件。 | |
FileStream | Create() | 创建文件,默认是所有用户均由权限操作文件 | |
void | MoveTo(string destFileName) | 将文件移动至制定的地方,并重命名 | |
FileStream | Open(FileMode mode) | FileMode : CreateNew:创建新文件,若文件已经存在,则报异常 create:创建新文件,若文件已经存在,则覆盖。 Open:打开文件,若不存在,报异常 OpenOrCreate:打开文件,不存在则创建 Truncate:未知 Append:若文件存在,则打开文件并定位到文件尾;若不存在,则创建 | |
FileStream | Open( FileMode, FileAccess, FileShare) | 同上,只不过是添加了一些权限、共享的限定。多种选择 | |
FileStream | OpenRead() | 创建只读的FileStream(将输入存在Stream中,且只能读取) | |
FileStream | OpenWrite() | 创建只写的FileStream(存入Stream、只能将信息写入文件) | |
StreamReader | OpenText() | 编码方式为:UTF-8,从当前文件读取数据的StreamReader对象 | |
void | Refresh() | 刷新,以换取FileInfo对象的最新状态 | |
FileInfo | Replace( string, string, bool ) | 第一个参数:被替换的文件名称 第二个参数:被替换文件的备份名称 第三个参数:是否忽略合并错误 |
创建文件的方法:
方法一:使用FileInfo对象的Create()方法
方法二:使用StreamWriter.WriteLine()方法
FileInfo、DirectoryInfo提供对象,writer/reader提供读写的操作。
8、File类
8.1 类说明。其为操作文件的静态类
public static class File
8.2 方法
返回值 | 名称 | 说明 | |
void | AppendAllLines( string path, IEnumerable<string> contents ) | 向指定的文件追加内容,若文件不存在,则创建 | |
void | AppendAllLines( String, IEnumerable<string>, Encoding ) | 同上,不过以指定的编码方式追加文本 | |
void | AppendAllText( string path, string contents ) | 同AppendAllLine(),不同之处是:一个是追加行,另一个是追加文本。 | |
void | AppendAllText( string path, string contents, Encoding encoding ) | 同上 | |
StreamWriter | AppendText() | 创建一个StreamWriter,其编码方式为:UTF-8 | |
void | copy( string sourceFileName, string destFileName ) | 复制,但是目标文件不可以已经存在。 | |
void | Copy(String, String, Boolean) | ||
FileStream | Create(string path) | 创建一个文件,并返回FileStream,若文件不存在,则创建。 | |
FileStream | Create( string path, int bufferSize ) | bufferSize 缓冲区的大小 | |
StreamWriter | CreateText(string path) | 与FileInfo类的CreateText()略有不同,一个有参数,一个无 | |
byte[] | ReadAllBytes( string path ) | 将二进制文件数据写入至字节数组中。 | |
string | ReadAllText( string path, [Encoding encoding] ) | 从某文件读取数据,[以某种编码方式] | |
IEnumerable<string> | ReadLines( string path, [Encoding encoding] ) | 读取每行数据,将数据存放在可枚举泛型集合 | |
void | WriteAllBytes( string path, byte[] bytes ) | 写入数据 | |
void | WriteAllLines( string path, IEnumerable<string> contents, [Encoding encoding] ) | 写入数据 | |
void | WriteAllText( string path, string contents, [Encoding encoding] ) | 写入数据 |
9、Stream类
public abstract class Stream : MarshalByRefObject, IDisposable
9.1 Stream抽象类的说明
Stream是所有流的抽象基类,流是字节序列的抽象概念
9.2、方法
返回 | 名称 | 说明 | |
void | Close() | 释放所有资源。此方法调用Dispose()方法。若流已经关闭,调用Close方法不会产生异常,但若调用其他方法,会产生异常。 | |
void | Flush | 清空缓冲区域,并将数据写入 | |
int | read( byte[] buffer, int offset, int count ) | 缓冲区中总字节数。 | |
int | ReadByte() | 每执行该方法,流内位置前推一个字节,返该位置。若达到流的尾部,则返回-1 | |
long | Seek( long offset, SeekOrigin origin ) | 设置当前流的位置 offset:偏移量,可为正可为负 origin:参考点。Begin、Current、End | |
void | SetLength( long length ) | 设定流的长度 | |
void | Write( byte[] buffer, int offset, int count ) | 写入 | |
void | WriteByte( byte value ) | 写入一个字节,并将当前位置增一 |
9.3 属性
名称 | 说明 |
CanRead { get; } | 是否可读,bool |
CanSeek { get; } | 是否支持查找,bool |
CanWrite { get; } | 是否可写,bool |
Length { get; } | 返回长度,long |
Position { get; set; } | 当前位置,long |
CanTimeout { get; } | 当前流是否具有超时功能,bool |
ReadTimeout { get; set; } | 设定读超时时间,int |
WriteTimeout { get; set; } | 设定写超时时间,int |
10、FileStream类
FileStream类所包含的方法或属性与Stream类相同,不列举。
FileStream类其只能读取/写入byte数据(字节或字节数组),因此用处不大。
11、TextReader/TextWriter抽象类
11.1 TextReader抽象类的方法
类型 | 返回值 | 方法名称 | 说明 |
void | Close() | 释放所有资源 | |
int | Peek() | 查看流中是否有字符,若到流的尾部了或此流不支持查找,则返回-1 | |
int | Read() | 读入下一个字符,若到尽头,则返回-1 | |
int | read( char[] buffer, int index, int count ) | 从index开始,共count个字符数据写入至buffer数组中。若至流的尾部,则返回0.(与Read()方法不同) | |
int | ReadBlock( char[] buffer, int index, int count ) | 从index开始,将count数量的字符写入至buffer字符数组。返回目前已经写入的数量。(其最大值等于count) | |
string | ReadLine() | 读取一行string,若到流的结尾,则返回null | |
string | ReadToEnd() | 读取从当前Position位置开始,至TextReader结尾的所有内容。 |
11.2 TextWriter抽象类
TextWriter抽象类的方法
返回类型 | 名称 | 说明 | |
void | Write( string format, Object object ) | 写入 | |
void | WriteLine(object) | 写入 |
TextWriter抽象类中,主要是Write、WriteLine方法,两者的参数是一样的。
参数主要有以下:
1、object(int 、string、char、….object)
2、(String,Object[])、(String Object)前一个参数为格式,后一个参数为写入流的内容
3、(char[], index, count),从index开始的count数量的char[]数组中的字符,写入至流中
4、(String, object1、object2、[object3]),按照某种格式,将和三为一。
【备注】:Console.WriteLine、Console.ReadLine就是Console.Out / In 属性分别包装了一个TextWrite.WriteLine/ ReadLine方法。
【完】