.NET中System.IO

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关联图

    .NET中System.IO_第1张图片

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 contents
)
向指定的文件追加内容,若文件不存在,则创建
  void AppendAllLines(
String,
IEnumerable,
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 ReadLines(
string path,
[Encoding encoding]
)
读取每行数据,将数据存放在可枚举泛型集合
  void WriteAllBytes(
string path,
byte[] bytes
)
写入数据
  void WriteAllLines(
string path,
IEnumerable 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抽象类

.NET中System.IO_第2张图片

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抽象类

.NET中System.IO_第3张图片

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方法。

【完】

转载于:https://my.oschina.net/u/144357/blog/175353

你可能感兴趣的:(.NET中System.IO)