第十三章 文件和注册表操作
目标 了解System.IO 命名空间 掌握读写文本文件的方法 掌握向文件读写二进制数据的方法 掌握读写内存流的方法 掌握注册表的操作方法
System.IO 命名空间 3-1 File对象 静态方法 Move Delete Copy CreateText OpenText
System.IO 命名空间 3-2 试一试: 把C:\WinNT\Win.INI文件拷贝到C:\下的代码,怎么写?
System.IO 命名空间 3-3 FileInfo类和File类 两者都提供对文件类似的操作 FileInfo不是静态对象
读写文本文件 3-1 System.IO 命名空间 File 类 FileStream 类 继承类 静态方法 CreateText(string FilePath) OpenText(string FilePath) Open(string FilePath, FileMode) Create(string FilePath) OpenRead(string FilePath) AppendText(string FilePath) 继承类 FileStream 类
在构造函数中使用的 FileMode、FileAccess 和 FileShare 参数都是 enum 类型 读写文本文件 3-2 FileStream 构造函数 FileStream 已重写构造函数 FileStream(string FilePath, FileMode) FileStream(string FilePath, FileMode, FileAccess) FileStream(string FilePath, FileMode, FileAccess, FileShare) 在构造函数中使用的 FileMode、FileAccess 和 FileShare 参数都是 enum 类型
FileMode 和FileShare ………… Append Create CreateNew Open OpenOrCreate Truncate FileShare None Read Write ReadWrite ………… FileStream fstream = new FileStream("Test.cs", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None); ………
文件读写例子 4-1
将转换后的Byte数组写入新建的文本文件 FileStream fs; try { fs = File.Create(txtFileName.Text); } catch MessageBox.Show("建立文件时出错。","错误", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Warning); return; byte[] content = new UTF8Encoding(true).GetBytes(txtContent.Text); fs.Write(content, 0, content.Length); fs.Flush(); MessageBox.Show("保存成功", "保存", System.Windows.Forms.MessageBoxIcon.Information); MessageBox.Show("写入文件时出错。","错误", System.Windows.Forms.MessageBoxButtons.OK, finally fs.Close(); 文件读写例子4-2 创建文件 将转换后的Byte数组写入新建的文本文件
文件读写例子 4-3 检查文件是否存在 打开文件流 class FileReadDemo { public static void Main() string path; Console.WriteLine ( "输入要读取的文件名。指定带路径的完整名称:"); path = Console.ReadLine (); try if (!File.Exists(path)) Console.WriteLine("文件不存在"); } else // 打开流以进行读取。 FileStream fs = File.OpenRead(path); 检查文件是否存在 打开文件流
文件读写例子 4-4 FileStream.Read() 用于从指定文件读取数据 //创建一个 byte 数组以读取数据 byte[] arr = new byte[100]; UTF8Encoding data = new UTF8Encoding(true); //继续读文件直到读取文件中的所有数据 while (fs.Read(arr,0,arr.Length) > 0) { Console.WriteLine(data.GetString(arr)); } catch(Exception ex) Console.WriteLine(“发生错误:" + ex.Message); FileStream.Read() 用于从指定文件读取数据
读写二进制文件 要使用 BinaryReader 和 BinaryWriter 类 这两个对象都需要在FileStream上创建 FileStream filestream = new FileStream(Filename, FileMode.Create); BinaryWriter objBinaryWriter = new BinaryWriter(filestream);
二进制文件读写对象 BinaryReader BinaryWriter Close() Read() ReadDecimal() ReadByte() ReadInt16() ReadInt32() ReadString() Close() Flush() Write()
关闭 FileStream 和 BinaryWriter 写二进制文件 public static void Main(String[] args) { Console.WriteLine("输入文件名:"); string Filename = Console.ReadLine(); FileStream filestream = new FileStream(Filename, FileMode.Create); BinaryWriter objBinaryWriter = new BinaryWriter(filestream); for (int index = 0; index < 20; index++) objBinaryWriter.Write((int) index); } Console.WriteLine("\二进制数据已写入文件"); objBinaryWriter.Close(); filestream.Close(); 创建FileStream 实例 创建BinaryWriter实例 写数据 关闭 FileStream 和 BinaryWriter
FileStream 和 BinaryReader 的实例 public static void Main(String[] args) { Console.WriteLine("输入文件名:"); string file = Console.ReadLine(); if (!File.Exists (file)) Console.WriteLine("文件不存在!"); } else FileStream filestream = new FileStream(file, FileMode.Open, FileAccess.Read); BinaryReader objBinaryReader = new BinaryReader(filestream); try while(true) Console.WriteLine(objBinaryReader.ReadInt32()); catch(EndOfStreamException eof) Console.WriteLine(“已到文件末尾"); 读二进制文件 FileStream 和 BinaryReader 的实例 读信息
读写内存流 Stream 类 抽象类 MemoryStream BufferedStream 对内存而不是对磁盘进行数据读写 减少了对临时缓冲区和文件的需要 对缓冲区进行数据读写 允许操作系统创建自己的缓冲区 输入/输出效率高且速度更快 在网络通讯的时候经常会使用到
BufferedStream 构造函数 public BufferedStream(Stream StName); 默认缓冲区大小为 4096 public BufferedStream(Stream StName, int bsize); 缓冲区大小
Stream 和 BufferedStream 的实例 通过缓冲区交换数据 2-1 public static void Main( ) { Console.WriteLine (“请输入文件名:"); string name = Console.ReadLine(); Console.WriteLine (“请输入备份文件名:"); string backup = Console.ReadLine(); if(File.Exists(name)) Stream inputStream = File.OpenRead(name); Stream outputStream = File.OpenWrite(backup); BufferedStream bufferedInput =new BufferedStream(inputStream); BufferedStream bufferedOutput =new BufferedStream(outputStream); Stream 和 BufferedStream 的实例
通过缓冲区交换数据 2-2 通过缓冲区进行读写 刷新并关闭 BufferStream byte[] buffer = new Byte[sizeBuff]; int bytesRead; while ((bytesRead = bufferedInput.Read(buffer,0,sizeBuff)) > 0 ) { bufferedOutput.Write(buffer,0,bytesRead); } Console.WriteLine(); Console.WriteLine("给定备份的文件已创建"); bufferedOutput.Flush( ); bufferedInput.Close( ); bufferedOutput.Close( ); else Console.WriteLine ("文件不存在"); 通过缓冲区进行读写 刷新并关闭 BufferStream
示例应用程序 3-1 学生详细信息用户界面 学生文件存储信息用户界面 //声明变量 private FileStream fstream; private void btnSave_Click(object sender, System.EventArgs e) { //准备将文本写入文件 string data; data = txtFirstName.Text + " " + txtLastName.Text + " " +txtClass.Text; data += " " + txtGrade.Text +"\n"; Byte[ ] info = new UTF8Encoding(true).GetBytes(data); //写数据 fstream.Write(info, 0, info.Length); //刷新并关闭 FileStream fstream.Flush(); fstream.Close(); frmStudentFile objfrmStudentFile = new frmStudentFile(); objfrmStudentFile.Show(); } 学生详细信息用户界面 学生文件存储信息用户界面 //声明变量 private FileStream fstream; public frmStudentEntry() //Constructor构造函数 { InitializeComponent(); fstream = File.Create("C:\\Student.txt"); } 将数据写入文本文件 刷新并关闭 FileStream
创建读取数据的 FileStream 的实例 示例应用程序 3-2 private void frmStudentFile_Load(object sender, System.EventArgs e) { FileStream fstream = File.OpenRead("C:\\Student.txt"); long filesize = fstream.Length; //创建一个 byte 数组以读取数据 byte[] arr = new byte[filesize]; UTF8Encoding data = new UTF8Encoding(true); //将文件内容读入数组 fstream.Read(arr,0,arr.Length); //拆分数组以检索单个字段值 string text = data.GetString(arr); string delim = " "; char [ ] delimiter = delim.ToCharArray(); string [ ] split = null; for (int x = 1; x <= text.Length; x++) split = text.Split(delimiter, x); } 创建读取数据的 FileStream 的实例 读取并存储数据 将记录数组拆分成单个字段
示例应用程序 3-3 将数组的内容赋给窗体字段 //将值赋给窗体中的各个字段 lblFirstNameValue.Text = split[0]; lblLastNameValue.Text = split[1]; lblClassValue.Text = split[2]; lblGradeValue.Text = split[3]; } 将数组的内容赋给窗体字段
目录和路径操作 静态方法 Directory类 Move Delete Exists CreateDirectory GetFiles SetCurrentDirectory
目录和路径操作 实例方法 DirectoryInfo类 MoveTo Delete GetDirectories Create GetFiles
目录和路径操作 静态方法 Path类 GetDirectoryName GetFileName GetFullPath Combine GetExtension HasExtension
读写注册表2-1 .NET框架在Microsoft.Win32名字空间中提供了两个类来操作注册表:Registry和RegistryKey。这两个类都是密封类不允许被继承。 Registry类 提供了7个公共的静态域,分别代表7个基本主键(其中两个在XP系统中没有,在这就不介绍了)分别是:Registry.ClassesRoot,Registry.CurrentUser,Registry.LocalMachine,Registry.Users,Registry.CurrentConfig。
读写注册表2-2 RegistryKey类 RegistryKey类中提供了对注册表操作的方法。要注意的是操作注册表必须符合系统权限,否则将会抛出错误。
创建子键 public RegistryKey CreateSubKey(string sunbkey); 参数sunbkey表示要创建的子键的名称或路径名。创建成功返回被创建的子键,否则返回null
打开子键 方法: public RegistryKey penSubKey(string name); public RegistryKey penSubKey(string name,bool writable); 参数name表示要打开的子键名或其路径名,参数writable表示被打开的子键是否允许被修改,前一个方法打开的子键是只读的。 Microsoft.Win32类还为我们提供了另一个方法,用于打开远程计算机上的注册表,方法原型为: public static RegistryKey OpenRemoteBaseKey(RegistryHive hKey,string machineName);
删除子键 public void DeleteKey(string subkey); 该方法用于删除指定的主键。如果要删除的子键还包含主键则删除失败,并返回一个异常,如果要彻底删除该子键极其目录下的子键可以用方法DeleteSubKeyTree,该方法原型如下: public void DeleteKeyTree(string subkey);
读取键值 public object GetValue(string name); public object GetValue(string name,object defaultValue); 参数name表示键的名称,返回类型是一个object类型,如果指定的键不存在则返回null。如果失败又不希望返回的值是null则可以指定参数defaultValue,指定了参数则在读取失败的情况下返回该参数指定的值。
设置键值 public object SetValue(string name,object value);
程序示例 using Microsoft.Win32; using System.Diagnostics; private void Access_Registry() { // 在HKEY_LOCAL_MACHINE\Software下建立一新键,起名为MCBInc RegistryKey key = Registry.LocalMachine.OpenSubKey("Software", true); // 增加一个子键 RegistryKey newkey = key.CreateSubKey("MCBInc"); // 设置此子键的值 newkey.SetValue("MCBInc", "NET Developer"); // 从注册表的其他地方获取数据 // 找出你的CPU RegistryKey pRegKey = Registry.LocalMachine; pRegKey = pRegKey.OpenSubKey("HARDWARE\\DESCRIPTION \\System\\CentralProcessor\\0"); Object val = pRegKey.GetValue("VendorIdentifier"); Debug.WriteLine("The central processor of this machine is:"+ val); // 删除键值 RegistryKey delKey = Registry.LocalMachine.OpenSubKey("Software", true); delKey.DeleteSubKey("MCBInc"); } 程序示例
总结 File是静态对象,提供对文件的创建、拷贝、移动和删除等一系列操作 FileStream 和BinaryReader、BinaryWriter对象结合起来可对二进制数据进行操作 在C#中指明文件名的时候,要使用转义字符“\\” 内存流提供无法调整大小的数据流视图,而且只能向其写入 BufferedStream对象对缓冲区进行读写