流是序列化设备的抽象表示。
一、System.IO命名空间中包含的类:
重点的类如下:
File
Directory
Path
FileInfo
DirectoryInfo
FileStreamInfo
FileStream
StreamReader
StreamWriter
FileSystemWatcher
二、File类常用的静态方法:
Copy() 将文件从原位置复制到目标位置
Create() 在指定的路径上创建文件
Delete()
Open() 返回指定路径上的FileStream对象
Move()
三、Directory类常用的静态方法:
CreateDirectory()
Delete() 删除指定的目录及其中的所有文件
GetDirections()
EnumerateDirectories() 与GetDirectories()类似,但返回目录名的IEnumerable<string>集合
GetFiles()
EnumerateFiles()
GetFileSystemEntries() 返回在指定目录中的文件和目录名的string对象数组
EnumerateFileSystemEntries()
Move()
四、FileInfo类
FileInfo类不像File类,它不是静态的,没有静态方法,仅可用于实例化的对象。FileInfo对象表示磁盘或网络位置上的文件。提供文件路径就可以创建一个FileInfo对象:
FileInfo aFile = new FileInfo(@”C:\Log.txt”);
FileInfo和File,在大多数情况下使用什么技术并不重要,但下面的规则有助于确定哪种技术更适合:
l 如果仅进行单一方法的调用,则可以使用静态File类的方法。在此,单一调用要快一些,因为.NET Framework不必实例化新对象,再调用方法。
l 如果应用程序在文件上执行几种操作,则实例化FileInfo对象并使用其方法就更好一些。这节省时间,因为对象已经在文件系统上引用正确的文件,而静态类必须每次都寻找文件。
FileInfo类也提供了与底层相关的属性,其中一些属性可以用来更新文件,其中很多属性都继承者自FileSystemInfo,所以可以应用于File和Directory类。
FileSystem类的属性如下:
Attributes 使用FileAttributes枚举,获取或设置当前文件或目录的特性
CreationTime,CreationTimeUtc 获取当前文件的创建日期和时间,可以用UTC和非UTC版本
Extension 提取文件扩展名,只读
Exists
FullName 索取文件的完整路径,只读
LastAccessTime 获取或设置上次访问当前文件的日期和时间,可以使用UTC和非UTC版本
LastAccessTimeUtc
LastWriteTime 获取或设置上次写入当前文件的日期和时间,可以使用UTC和非UTC版本
LastWriteTimeUtc
Name 索取文件的完整路径,只读抽象属性,在FileInfo和DirectoryInfo中进行了重写
FileInfo的专用属性:
Directory 检索一个DirectoryInfo对象,表示包含当前文件的目录。只读
DirectoryName 返回文件目录的路径。只读
IsReadOnly 文件只读特定的快捷方式。这个属性也可以通过Attributes来访问
Length 获取文件容量(以字节为单位),返回long值。只读
FileInfo对象本身不表示流。要读写文件,必须创建Stream对象。FileInfo对象提供了几个返回实例化Stream对象的方法来帮助做到这一点。
五、DirectoryInfo类
DirectoryInfo专用属性
Parent 检索一个DirectoryInfo对象,表示包含当前目录的目录。只读
Root 根目录
可以使用Directory.GetCurrentDirectory()找出工作目录的当前设置,也可以使用Directory.SetCurrentDirectory()设置新路径。
六、FileStream对象
这个类提供了在文件中读写字节的方法,但经常使用StreamReader或StreamWriter执行这些功能。这是因为FileStream类操作的是字节和字节数组,而Stream类操作的是字符数据。字符数据易于使用。但有些操作,如随机文件访问(访问文件中间某点的数据),就必须由FileStream对象执行。
构造函数:
(1)FileStream aFile = new FileStream(filename,FileMode.Member);
FileMode枚举指定了如何打开或创建文件
(2)FileStream aFile = new FileStream(filename,FileMode.Member,FileAccess.Member);
FileAccess枚举指定了流的作用,其成员有Read、Write、ReadWrite
File和FileInfo类都提供了OpenRead()和OpenWrite()方法,更易于创建FileStream对象。
Seek()方法实现了随机读取
.NET 4引入了一个新的名称空间System.IO.MenoryMappedFiles,它包含的类型(如MemoryMappedFile)提供了另一种随机访问特大文件的方式。
处理原始字节的功能使FileStream类可以用于任何数据文件,而不仅是文本文件。
FileStream对象的Read()方法获取的字节数组可以使用System.Text名称空间的Decoder类转为字符数组。例:
Decoder d = Encoding.UTF8.GetDecoder();
d.GetChars(byData,0,byData.Length,charData,0);
向随机文件写入数据,首先要创建一个字节数组;最简单的办法是首先用String类的ToCharArray()静态方法构建要写入文件的字符数组,然后使用Encoder对象将其转为字节数组。例:
CharData = “My pink half of the drainpipe.”.ToCharArray();
Encoder e = Encoding.UTF8.GetEncoder();
e.GetBytes(charData,0,charData.Length,byData,0,true);
七、序列化对象
.NET Framework在System.Runtime.Serialization和System.Runtime.Serializaioin.Formatter名称空间中提供了序列化对象的基础架构。
System.Runtime.Serialization.Formatters.Binary:这个名称空间包含了BinaryFormatter类,它能把对象序列化为二进制数据,把二进制数据序列化为对象。
IFormatter接口提供了如下两个方法:
void Serialize(Stream stream,object source)
object Deserialize(Stream stream)
使用BinaryFormatter进行序列化非常简单:
IFormatter serializer = new BinaryFormatter();
serializer.Serialize(myStream,myObject);
反序列化也很简单:
IFormatter serializer = new BinaryFormatter();
MyObjectType myNewObject = serializer.Deserialize(myStream) as MyObjectType;