+ 对象本地存储(自定义类读写文件))
文件对话框OpenFileDialog / FolderBrowserDialog一、知识点概述1、文件对话框属于WinForm自带交互控件无需手动拖拽可代码直接实例化调用。2、OpenFileDialog文件打开对话框用于选择本地文件支持筛选文件类型、设置初始路径可读取选中文件内容。3、FolderBrowserDialog文件夹浏览对话框专门用于选择本地文件夹只能获取文件夹路径不能选择文件。4、核心逻辑弹出对话框 → 用户选择路径 → 判断确认状态 → 获取选中路径执行业务操作。二、完整源代码using System; using System.IO; using System.Text; using System.Windows.Forms; namespace _1文件对话框 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { #region 【1.文件打开对话框注释代码】 ////1.实例化文件打开对话框对象 //OpenFileDialog ofd new OpenFileDialog(); ////2.设置对话框初始打开路径 //ofd.InitialDirectory D:\; ////3.设置对话框标题 //ofd.Title 打开文件; ////4.设置文件类型过滤只显示指定格式文件 //ofd.Filter 文本文件|*.txt|图片|*.jpg; ////5.弹出对话框接收用户操作结果 //DialogResult result ofd.ShowDialog(); ////6.判断用户点击【确定】读取选中文件内容 //if (result DialogResult.OK) //{ // //FileName获取选中文件的完整绝对路径 // this.Text File.ReadAllText(ofd.FileName, Encoding.Default); //} #endregion #region 【2.文件夹浏览对话框运行代码】 //1.实例化文件夹选择对话框 FolderBrowserDialog folderBrowserDialog new FolderBrowserDialog(); //2.设置对话框提示描述文字 folderBrowserDialog.Description 选择一个文件夹; //3.设置对话框根目录默认打开公共文档目录 folderBrowserDialog.RootFolder Environment.SpecialFolder.CommonDocuments; //4.弹出文件夹选择框判断用户是否点击确定 if (folderBrowserDialog.ShowDialog() DialogResult.OK) { //SelectedPath获取用户选中的文件夹完整路径 Console.WriteLine(folderBrowserDialog.SelectedPath); //将选中路径赋值给窗体标题 this.Text folderBrowserDialog.SelectedPath; } #endregion } } }三、第一模块OpenFileDialog 文件打开对话框分段拆解1、实例化对话框对象OpenFileDialog ofd new OpenFileDialog();创建文件选择对话框实例用于后续配置属性、弹出窗口、选择文件。2、InitialDirectory 初始路径ofd.InitialDirectory D:\;设置对话框默认打开的文件夹路径程序启动弹窗直接定位到指定目录。3、Title 对话框标题ofd.Title 打开文件;自定义弹出窗口的顶部标题文字提升界面友好度。4、Filter 文件类型过滤重点ofd.Filter 文本文件|*.txt|图片|*.jpg;作用筛选可选择的文件类型隐藏其他格式文件。格式规则说明文字|后缀规则|说明文字|后缀规则示例解析只展示txt文本文件和jpg图片文件。5、ShowDialog() 弹出窗口DialogResult result ofd.ShowDialog();弹出模态文件选择窗口阻塞当前程序等待用户操作返回操作结果枚举。6、判断用户操作 读取文件if (result DialogResult.OK) { this.Text File.ReadAllText(ofd.FileName,Encoding.Default); }DialogResult.OK用户选中文件并点击确定ofd.FileName获取选中文件的完整绝对路径通过File.ReadAllText读取文件内容赋值给窗体标题展示。四、第二模块FolderBrowserDialog 文件夹浏览对话框分段拆解1、实例化文件夹对话框FolderBrowserDialog folderBrowserDialog new FolderBrowserDialog();创建文件夹选择弹窗对象专门用于选择文件夹无法选中单个文件。2、Description 提示描述folderBrowserDialog.Description 选择一个文件夹;弹窗顶部自定义提示文字引导用户操作。3、RootFolder 设置根目录folderBrowserDialog.RootFolder Environment.SpecialFolder.CommonDocuments;设置对话框的顶级根目录限制用户只能在该目录下选择文件夹。常用系统枚举Environment.SpecialFolder.Desktop → 桌面Environment.SpecialFolder.CommonDocuments → 公共文档4、弹窗并判断选择状态if (folderBrowserDialog.ShowDialog() DialogResult.OK)弹出文件夹选择窗口判断用户是否点击确定按钮。5、获取选中文件夹路径Console.WriteLine(folderBrowserDialog.SelectedPath); this.Text folderBrowserDialog.SelectedPath;SelectedPath属性专门获取用户选中的文件夹完整绝对路径控制台打印路径同时赋值给窗体标题展示。五、两种对话框核心区别1、OpenFileDialog选择单个文件可筛选文件格式、读取文件内容2、FolderBrowserDialog选择整个文件夹只能获取文件夹路径无法操作单个文件。六、核心属性总结OpenFileDialog 常用属性InitialDirectory初始打开路径Title对话框标题Filter文件格式筛选FileName获取选中文件完整路径FolderBrowserDialog 常用属性Description弹窗提示文字RootFolder设置根目录范围SelectedPath获取选中文件夹路径七、易错点1、Filter格式必须严格规范中英文符号不能混用否则筛选失效2、文件夹对话框只能选文件夹不能读取单个文件内容3、必须判断 DialogResult.OK防止用户点击取消后报错4、RootFolder只能设置系统预设目录不能自定义对象本地存储自定义类读写文件一、知识点概述1、默认情况下对象只能存在内存中程序关闭、窗口关闭对象数据直接清空。2、对象存储核心将自定义类对象的属性数据通过文件流写入本地txt文件实现数据持久化保存。3、读写流程写入页面数据 → 赋值给对象属性 → FileStreamStreamWriter 逐行写入本地文件读取本地文件 → StreamReader逐行读取 → 赋值给新对象属性 → 回显到页面4、使用using自动释放资源替代手动Close、Dispose代码更安全。二、完整可运行代码using System; using System.IO; using System.Windows.Forms; namespace _2对象的存储 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } //【写入按钮对象数据保存到本地文件】 private void button1_Click(object sender, EventArgs e) { //1.实例化人类对象接收文本框输入的数据 People p new People() { Name textBox1.Text, Age textBox2.Text, Sex textBox3.Text, Phone textBox4.Text }; //2.创建文件流创建/覆盖1.txt文件 FileStream fs new FileStream(1.txt, FileMode.Create); //3.创建文本写入流绑定文件流 StreamWriter sw new StreamWriter(fs); //4.逐行写入对象的每一个属性 sw.WriteLine(p.Name); sw.WriteLine(p.Age); sw.WriteLine(p.Sex); sw.WriteLine(p.Phone); //5.手动关闭流、释放资源 sw.Close(); fs.Close(); sw.Dispose(); fs.Dispose(); } //【读取按钮本地文件数据读取赋值给对象】 private void button2_Click(object sender, EventArgs e) { //1.创建空对象用于接收读取的数据 People p1 new People(); //2.using自动释放文件流资源 using (FileStream fs new FileStream(1.txt, FileMode.Open)) { //3.创建读取流 StreamReader sr new StreamReader(fs); //4.逐行读取赋值给对象属性 p1.Name sr.ReadLine(); p1.Age sr.ReadLine(); p1.Sex sr.ReadLine(); p1.Phone sr.ReadLine(); } //5.将对象数据回显到文本框 textBox1.Text p1.Name; } } //【自定义人类实体类】 public class People { //自动属性姓名、年龄、性别、电话 public string Name { get; set; } public string Age { get; set; } public string Sex { get; set; } public string Phone { get; set; } } }三、代码分段详细拆解第一段自定义实体类 Peoplepublic class People { public string Name { get; set; } public string Age { get; set; } public string Sex { get; set; } public string Phone { get; set; } }作用封装用户的所有数据信息统一存储在对象中方便整体读写操作。特点使用自动属性get/set用于接收、存储数据。第二段写入按钮核心逻辑button1_Click1、实例化对象接收页面数据People p new People() { Name textBox1.Text, Age textBox2.Text, Sex textBox3.Text, Phone textBox4.Text };把四个文本框输入的用户数据全部封装到People对象中。2、创建文件流 FileStreamFileStream fs new FileStream(1.txt, FileMode.Create);FileMode.Create创建文件文件存在则覆盖原有所有内容不存在则新建。3、文本写入流 StreamWriterStreamWriter sw new StreamWriter(fs);专门用于写入文本内容绑定FileStream文件流。4、逐行写入对象属性sw.WriteLine(p.Name); sw.WriteLine(p.Age); sw.WriteLine(p.Sex); sw.WriteLine(p.Phone);WriteLine写入数据并自动换行保证读取时按行对应数据不乱序。5、手动关闭与释放资源sw.Close(); fs.Close(); sw.Dispose(); fs.Dispose();Close()关闭流Dispose()彻底释放文件资源防止文件被程序锁定占用。第三段读取按钮核心逻辑button2_Click1、创建空对象People p1 new People();定义空对象用于接收从文件读取出来的数据。2、using 文件流打开文件using (FileStream fs new FileStream(1.txt, FileMode.Open))FileMode.Open打开已有文件文件不存在直接报错。using作用代码执行完毕后自动释放文件流资源无需手动写Close、Dispose。3、StreamReader逐行读取赋值StreamReader sr new StreamReader(fs); p1.Name sr.ReadLine(); p1.Age sr.ReadLine(); p1.Sex sr.ReadLine(); p1.Phone sr.ReadLine();ReadLine()按行读取文本严格对应写入顺序一一赋值给对象属性。4、数据回显页面textBox1.Text p1.Name;将读取到的对象数据重新展示到文本框中完成数据读取回显。四、各类文件读写类区别课堂重点1、File.WriteAllText静态方法一行代码读写无需创建流对象2、FileStream文件基础流负责字节层面读写3、StreamWriter / StreamReader专门读写文本字符串4、BufferedStream缓冲流提升读写效率5、BinaryReader二进制读写适合非文本文件。五、手动释放 vs using释放 区别1、手动写法必须写 Close()、Dispose()少写会导致文件占用、内存泄漏2、using写法执行完大括号代码自动释放资源更安全、开发首选。六、核心原理总结1、对象不能直接保存到本地必须拆分为文本/字节数据写入文件2、写入顺序和读取顺序必须严格一致否则数据错乱3、FileMode.Create 覆盖写入FileMode.Open 只读打开4、所有流对象使用完毕必须释放资源5、实现效果关闭程序再打开依然可以读取上次保存的用户数据数据持久化。七、易错点1、读写顺序不一致导致属性赋值错乱2、写入使用Create覆盖模式会清空历史数据3、忘记关闭释放流资源文件一直被占用无法修改删除4、读取时文件不存在程序直接报错。