命名空间System.IO的功能就是进行输入/输出。这个命名空间里的类按照功能可以分为三类:用于处理字节流的类、对字节进行高级读写的类、处理文件和目录的类。这三种类搭配起来使用,功能就非常强大。最常用的使用方式就是先使用File类把文件打开,这样会得到一个Stream对象,然后用Read和Write对象对Stream对象进行读写操作。
用于处理字节流的类
BufferedStream给另一流上的读写操作添加一个缓冲层。
FileStream公开以文件为主Stream,既支持同步读写操作,也支持异步读写操作。
MemoryStream创建以内存作为其支持存储区的流。
Stream提供字节序列的一般视图。
流是字节序列的抽象概念。Stream类是所有流的抽象基类。可以支持流的读取、写入、查找。读取是从流到数据结构的数据传输;写入是从数据结构到流的数据传输;查找是对流内的当前位置进行查找和修改,查找功能取决于流具有后备存储区类型。根据基础数据源或储存库,流可能只支持这些功能中的一部分。通过CanRead、CanWrite、CanSeek属性,可以查询流的功能。Read和Write方法读写各种不同各式的数据。对于支持查找的流是用Seek、SetLength方法,以及Position和Length属性可查询和修改流的当前位置和长度。Flush方法清除所有内部缓冲区,并确保将所有数据写入基础数据流或存储库。Close将刷新所有经过缓冲处理的数据,并释放资源。另外,流类还提供了对后备存储进行同步访问和异步访问的方法,一般对于关系松散的Internet比较有用。
在实现 Stream 的派生类时,必须提供 Read 和 Write 方法的实现。异步方法BeginRead、EndRead、BeginWrite 和 EndWrite 通过同步方法 Read 和 Write 实现。同样,Read和 Write 的实现也将与异步方法一起正常工作。ReadByte 和 WriteByte 的默认实现创建一个新的单元素字节数组,然后调用 Read 和 Write 的实现。当从 Stream 派生时,如果有内部字节缓冲区,则强烈建议重写这些方法以访问内部缓冲区,这样性能将得到显著提高。还必须提供 CanRead、CanSeek、CanWrite、Flush、Length、Position、Seek和 SetLength 的实现。
对字节进行高级读写的类
BinaryReader用特定的编码将基元数据类型读作二进制值。
BinaryWriter以二进制形式将基元类型写入流,并支持用特定的编码写入字符串。
StreamReader实现一个 TextReader,使其以一种特定的编码从字节流中读取字符。
StreamWriter实现一个 TextWriter,使其以一种特定的编码向流中写入字符。
StringReader实现从字符串进行读取的 TextReader。
StringWriter实现一个用于将信息写入字符串的 TextWriter。该信息存储在基础 StringBuilder 中。
TextReader 表示可读取连续字符系列的阅读器。
TextWriter表示可以编写一个有序字符系列的编写器。该类为抽象类。
这些类用来读写流并且位数据提供高级视图。
处理文件和目录的类
Directory——公开用于创建、移动和枚举目录和子目录的静态方法。
DirectoryInfo——公开用于创建、移动和枚举目录和子目录的实例方法。
File——提供用于创建、复制、删除、移动和打开文件的静态方法,并协助创建FileStream对象。
FileInfo——提供创建、复制、删除、移动和打开文件的实例方法,并且帮助创FileStream对象。
FileSystemInfo——是FileInfo和DirectoryInfo类的基类。
FileSystemWatcher——侦听文件系统更改通知,并在目录或目录中的文件发生更改时引发事件。
Path——对包含文件或目录路径信息的 String实例执行操作。这些操作是以跨平台的方式执行的。
这些类都提供了非常丰富的方法。但是过于丰富使用起来也多有不便。不如把常用功能抽象出来,封装到自己的类里。其中有三个方法很重要,记录如下:
'拷贝文件或目录
'将sourcePath指定的文件或目录拷贝到destPath指定的目录下
'参数sourcePath决定要移动哪个文件或目录
'参数destPath决定要移动到那个文件或目录下
Public Shared Sub Copy( _
ByVal sourcePath As String, ByVal destPath As String)
Try
'如果源路径是一个文件名
If File.Exists(sourcePath) Then
'如果目标路径不存在
If Not Directory.Exists(destPath) Then
'创建目标路径
Directory.CreateDirectory(destPath)
End If
'得到文件名
Dim filename As String
Dim index As Integer
index = sourcePath.LastIndexOf("/")
filename = sourcePath.Substring(index)
'如果该文件已存在就删除它重新拷贝
If File.Exists(destPath & filename) Then
FileSystem.Delete(destPath & filename)
End If
'拷贝文件
File.Copy(sourcePath, destPath & filename)
'如果源路径是一个目录
ElseIf Directory.Exists(sourcePath) Then
Dim index As Integer
Dim str As String
index = sourcePath.LastIndexOf("/")
str = sourcePath.Substring(index)
'在目标路径下创建路径
If Not Directory.Exists(destPath & str) Then
Directory.CreateDirectory(destPath & str)
End If
'得到源目录下的所有文件
Dim files() As String = Directory.GetFiles(sourcePath)
'拷贝所有文件
For Each f As String In files
FileSystem.Copy(f, destPath & str) '迭代
Next
'得到源目录下的所有子目录
Dim dirs() As String = Directory.GetDirectories(sourcePath)
'拷贝所有子目录
For Each d As String In dirs
FileSystem.Copy(d, destPath & str) '迭代
Next
Else '源路径既不是一个文件也不是一个目录,就抛出异常。
Throw New Exception("参数sourcePath所指定的文件或目录不存在。")
End If
Catch ex As Exception
Throw ex
End Try
End Sub
'删除制定目录及其下的所有子目录和所有文件
Public Shared Sub Delete(ByVal path As String)
Try
If file.Exists(path) Then
file.Delete(path)
ElseIf Directory.Exists(path) Then
Dim subdirs() As String
subdirs = Directory.GetDirectories(path)
For Each dir As String In subdirs
FileSystem.Delete(dir)
Next
Dim files() As String
files = Directory.GetFiles(path)
For Each file As String In files
FileSystem.Delete(file)
Next
Directory.Delete(path)
End If
Catch ex As Exception
Throw ex
End Try
End Sub
'移动文件或目录
'将sourcePath指定的文件或目录移动到destPath指定的目录下
'参数sourcePath决定要移动哪个文件或目录
'参数destPath决定要移动到那个文件或目录下
Public Shared Sub Move( _
ByVal sourcePath As String, ByVal destPath As String)
Try
If FileSystem.IsFile(destPath) Then
Throw New Exception("参数destPath指定了一个文件。该参数应该传递一个有效的目录名称。")
End If
If Not Directory.Exists(destPath) Then
Directory.CreateDirectory(destPath)
End If
If Not FileSystem.Exists(sourcePath) Then
Throw New Exception("参数sourcePath指定的目录或文件不存在。该参数必须指定一个有效的文件或目录。")
End If
Dim index As Integer = sourcePath.LastIndexOf("/")
Dim str = sourcePath.Substring(index)
Directory.Move(sourcePath, destPath & str)
Catch ex As Exception
Throw ex
End Try
End Sub