数据存取技术篇
文件与注册表存取技术
C#将每个文件看做顺序字节流,每个文件以一个文件结束标志或者特殊的字节符结束。
Console.In:返回标准的输入流对象,使得程序能够从键盘读取数据
Console.Out:返回标准的输出流对象,使得程序能够像屏幕输出数据
Console.Error:返回标准的而错误流对象
System.IO.Stream提供了将流表示成字节的功能。
FileStream:读写文件
MemoryStream:读写内存
BufferedStream:缓冲区的读写数据
目录管理:(DirectoryInfo类)
Directory类包含了用于创建、移动、删除和美剧目录子目录的成员集。基类为:FileSystemInfo。
成员:
Create()创建目录,参数:路径名
CreateSubdirectory():创建子目录集。参数:路径名
CopyDirectory():给定两个目录路径,将源目录复制到新路径
Delete():删除目录及其所有内容
GetFiles():提取一个FileInfo类型的额数组,表示给定目录中的文件集
MoveTo():将目录及其内容转移到新的路径中
Parent属性:提取给定路径的父目录
Root属性:返回给定路径的根目录
Exists属性:返回是否已经存在
Attributes 返回和文件相关的属性值,运用了FileAttributes枚举类型值
CreationTime 返回文件的创建时间
Exists 检查文件是否存在于给定的目录中
Extension 返回文件的扩展名
LastAccessTime 返回文件的上次访问时间
FullName 返回文件的绝对路径
LastWriteTime 返回文件的上次写操作时间
Name 返回给定文件的文件名
Delete() 删除一个文件的方法,请务必谨慎地运用该方法
DirectoryInfo dir1 = new DirectoryInfo(@"F:\Test");
Console.WriteLine("Full Name is : {0}", dir1.FullName);
Console.WriteLine("Attributes are : {0}", dir1.Attributes.ToString());
目录管理处最重要的思想就是递归。利用递归循环思想,可以遍历所有目录。
要执行目录删除可以利用DirectoryInfo类的Delete()方法。但是如果目录是只读类型的删除将会发生异常。
是同Dirctory类,同样乐意实现目录管理。Directory静态成员的功能同DirectoryInfo类似。只是Directory类返回字符串,而不是像DiInfo类返回类型FileInfo或者DirctoryInfo对象。
FileInfo[] files=(new DirectoryInfo(C:\\)).GetFiles();
与
String[] files =Directory.GetFiles("C:\\");
类似,区别仅仅是返回内容的类型不同。
文件管理:FileInfo类。
Directory:获得父目录的一个实例
DirectoryName:获得父目录的全路径
Length:获得当前文件或目录的大小
Name:返回文件名
AppendText():创建一个StreamWriter类型,将其文本同文件关联起来。
CopyTo():复制一个已有文件为一个新文件
Create()创建一个新文件,返回一个FileStream类型,同新创建的文件交互。
CreateText():创建一个StreamWriter类型,用于写一个新的文本文件
Delete()删除一个FileInfo类型的文件
MoveT0():将制定文件移动到新的位置
Open():打开一个新的文件
OpenRead()创建一个只读的FileStream
OpenText()创建一个StreamReader类型,从已有的文件读取信息
OpenWrite()方法,创建一个只写FileStream类型
@"c:\test.txt"等同于"c:\\test.txt"
使用FileInfo类的时候,必须先创建一个该类的对象,并且为对象的方法传递相应的参数。
MoveTo不支持覆盖已存在文件的方法。
要打开文件,可以使用FileInfo.Open()方法,但注意的是打开之后的类型是FileStream。如: FileStream MyStream=MyFile.Open(FileMode.Open,FileAcess.Read,FileShare.None)
File 类的功能同FileInfo类的类型类似。其静态成员的功能与FileInfo类一样。
驱动器管理:DriveInfo类
读写文件:Stream类位于System.IO命名空间,是一个抽象类,支持对于字节的续写操作由于Stream类是一个抽象类。因此在使用的时候,需要多起进行派生,重载其抽象成员。
-
读操作:即从六种读取数据,将读取的数据存到另一种数据结构中。
-
写操作:将数据写入流中。
-
搜索操作:从流的而当前位置开始搜索,定位到指定的位置
Method/ Properties | 描述 |
void Close() | 关闭流 |
void Flush() | 清理流中的内容,清除所有缓冲区,并将缓冲区的内容写入到储存设备中。 |
int ReadByte() | 返回一个整数表示输入的字节数,如果没有数据返回-1 |
int Read(byte[ ] buf,int offset, int numBytes) | 将numBytes个字节读入到byte[ ]的以offset为起始位置,返回读入成功的字节数 |
Long Seek(long offset,SeekOrigin origin) | 将当前位置定位到以origin为初始位置以后的offset处. |
void WriteByte(byte b) | 将单个字节写入到一个输出流. |
void Write(byte[ ] buf,int offset, int numBytes) | 写入buf,byte[ ] 中从offset开始的numBytes个字节. |
bool CanRead | 是否可读 |
bool CanSeek | 是否支持寻址 |
bool CanWrite | 是否可以写入数据 |
long Length | 流的长度 |
long Position | 流的当前位置. |
FileStream类继承了Stream类的方法和属性,这些方法和属性在操作流时非常有用。一般可以按如下的操作顺序处理文件流类。
1.创建一个文件流
通过使用FileStream的构造函数,或者像开头几节介绍的那样,通过File或FileInfo类的相关方法返回一个FileStream对象实例。
FileStream类提供了15种重载的构造函数,一些比较常使用的构造函数的声明如下所示。
//使用指定的路径和创建模式创建FileStream类的实例
public FileStream(string path, FileMode mode);
//使用指定的路径和创建模式,以及访问权限创建FileStream类的实例
public FileStream(string path, FileMode mode, FileAccess access);
//使用指定的路径和创建模式,以及共享权限创建FileStream类的实例
public FileStream(string path, FileMode mode, FileAccess access, FileShare share);
FileMode、FileAccess与FileShare都是枚举类型。
FileMode指定创建文件流实例时,打开指定文件时的模式,有如下几种可选值。
— Append:打开文件并定位到文件尾,或创建新文件。
— Create:创建新的文件,如果文件存在,则被覆盖。
— CreateNew:创建新的文件,如果文件存在,则引发IOException。
— Open:打开现有文件,如果文件不存在,则引发FileNotFoundException。
— OpenOrCreate:打开文件,如果不存在,创建新文件。
— Truncate:打开现有文件,并将打开的文件截断为0字节大小。
FileAccess用于指定读和写的访问权限。有如下几种可选值。
— Read:对文件的读访问。
— ReadWrite:对文件的可读写访问。
— Write:对文件的写访问。
FileShare指定共享访问权限。共享访问权限是指:有多个人同时对某一文件进行并发操作的使用权限。有如下几种可选值。
— Delete:允许随后的请求删除文件。
— Inheritable:使文件名柄由子进程继承。
— None:文件以独占方式打开,关闭前,任何请求都将失败。
— Read:允许其他请求读取。
— ReadWrite:允许其他请求读取和写入。
— Write:允许其他人写入
C#
public override int Read(
byte[] array,
int offset,
int count
)
参数
array 类型:array<System..::.Byte>[]()[]此方法返回时包含指定的字节数组,数组中 offset 和 (offset + count - 1) 之间的值被从当前源中读取的字节替换。
offset 类型:System..::.Int32array 中的字节偏移量,将在此处开始读取字节。
count 类型:System..::.Int32最多读取的字节数。
public override void Write(
byte[] array,
int offset,
int count
)
array 类型:array<System..::.Byte>[]()[]包含要写入该流的数据的缓冲区。
offset 类型:System..::.Int32array 中的从零开始的字节偏移量,从此处开始将字节复制到当前流。
count 类型:System..::.Int32要写入当前流的字节数。
ReadStream
Peek 方法在读取下一行之前先检验该行
ReadLine 逐行读取
SR.BaseStream.Position:用来初始化流的起始位置
sr.BaseStream.Position =90;与sr.Read(,,)连用可以,读取流中的制定开始位置开始到指定位置结束,存入到数组的指定位置。
使用BinaryWriter与BinaryReader
使用.NET注册表类读写注册表信息
RegistryKey:实例表示一个注册表项。其方法用于浏览子键,创建新建,读取修改键中的值。常用属性包括:
Name:键的名称
SubKeyCount 键的子健个数
ValueCount:键包含的值得个数
常用方法:
Close()关闭键
CreateSubKey()创建给定名称的子键。(如果子键存在,就打开它)
DeleteSubKey()删除指定的子键
DeleteSubKeyTree()递归删除子键及其所有的子键
DeleteValue():从键中删除一个指定的值
GetAcessControl():返回自己顶注册表键的访问控制表
GetSubKeyNames():返回包含所有子键名称的字符串数据数组
GetValue():返回指定的值
GetValueKind():返回指定的值,检索其注册表数据类型
GetValueNames():返回一个包含所有键值名称的字符串数组
OpenSubKey():返回表示给定子键的RegistryKey实例引用
SetAcessControl():吧访问控制表(ACL)应用于指定的注册表键
SetValue():设置指定的值