当前位置: 首页 > news >正文

C#WinForm 文件对话框(OpenFileDialog / FolderBrowserDialog)+ 对象本地存储(自定义类读写文件)

文件对话框(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、读写流程:

写入:页面数据 → 赋值给对象属性 → FileStream+StreamWriter 逐行写入本地文件

读取:本地文件 → 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; } } }

三、代码分段详细拆解

第一段:自定义实体类 People

public 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_Click)

1、实例化对象,接收页面数据
People p = new People() { Name = textBox1.Text, Age = textBox2.Text, Sex = textBox3.Text, Phone = textBox4.Text };

把四个文本框输入的用户数据,全部封装到People对象中。

2、创建文件流 FileStream
FileStream fs = new FileStream(@"1.txt", FileMode.Create);

FileMode.Create:创建文件,文件存在则覆盖原有所有内容,不存在则新建。

3、文本写入流 StreamWriter
StreamWriter 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_Click)

1、创建空对象
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、读取时文件不存在,程序直接报错。

http://www.gsyq.cn/news/1576756.html

相关文章:

  • (2026最新)乌鲁木齐防水补漏正规公司甄选推荐:漏水检测维修-暗管漏水精准定位检测漏水点-卫生间/厨房/屋顶/阳台/渗漏水维修-本地人必选的正规测漏公司 - 即刻修防水
  • 2026年现阶段,天津玻璃极窄门工厂如何选?这家实力企业值得关注 - 品牌鉴赏官2026
  • 2026随州防水补漏避坑指南:卫生间/厨房/阳台/屋顶/地下室漏水检测维修全攻略,正规施工+透明报价+口碑榜靠谱服务商推荐 - 安佳防水
  • 2026阳江防水补漏避坑指南:卫生间/厨房/阳台/屋顶/地下室漏水检测维修全攻略,正规施工+透明报价+口碑榜靠谱服务商推荐 - 安佳防水
  • 番禺家装空间布局技巧
  • ansible剧本应用案例集合2
  • 2026年更新:探寻山东地区信誉与实力兼备的氟碳铝镁锰板制造厂 - 品牌鉴赏官2026
  • 2026最新国学专业排盘工具深度评测:破解终身更新与断更迷局
  • 2026年当下,长春短视频创作内容培训如何选?一勤职业技能培训学校全方位解析 - 品牌鉴赏官2026
  • LLM代理安全新范式:基于能力令牌的CapSeal框架解析与实践
  • 日供一卒 6.22
  • 5分钟快速搭建服务器状态监控页面:Upscuits完整指南
  • 2026八字排盘App推荐给进阶用户吗?命理软件要看学习和复盘闭环
  • 如何用5个步骤彻底解决音频格式混乱问题
  • Tree of Concepts:融合概念瓶颈与决策树,实现可解释的持续学习
  • 2026金华防水补漏避坑指南:卫生间/厨房/阳台/屋顶/地下室漏水检测维修全攻略,正规施工+透明报价+口碑榜靠谱服务商推荐 - 安佳防水
  • 2026钦州防水补漏避坑指南:卫生间/厨房/阳台/屋顶/地下室漏水检测维修全攻略,正规施工+透明报价+口碑榜靠谱服务商推荐 - 安佳防水
  • 大模型工具使用评估基准AgentProp-Bench:从误差传播到工程实践
  • 上海离婚律所联系方式推荐 覆盖涉外婚姻继承等全品类家事纠纷 - 外贸老黄
  • NXP MWCT101x 22W无线充电发射器方案:从Qi协议到MP-A11拓扑的工程实践
  • libjpeg-turbo:用 SIMD 加速的 JPEG 编解码库
  • TensorHub:面向AI大模型的高效张量存储与压缩系统设计实践
  • 2026银川防水补漏避坑指南:卫生间/厨房/阳台/屋顶/地下室漏水检测维修全攻略,正规施工+透明报价+口碑榜靠谱服务商推荐 - 安佳防水
  • 2026郴州防水补漏避坑指南:卫生间/厨房/阳台/屋顶/地下室漏水检测维修全攻略,正规施工+透明报价+口碑榜靠谱服务商推荐 - 安佳防水
  • 上海继承纠纷律师联系方式推荐 家理马赛男擅长处理涉外继承纠纷 - 外贸老黄
  • AI专著生成工具实测,快速产出20万字专著,质量有保障!
  • 无人机飞控安全:电压毛刺攻击如何绕过PX4失效保护机制
  • 深圳离婚律所联系方式推荐 专注涉港澳跨境婚姻家事法律服务 - 外贸老黄
  • 2026黄石漏水检测维修精选优质服务商TOP5推荐!卫生间漏水/厨房漏水/屋顶天花板漏水/阳台漏水/地下室漏水防水补漏检测维修-正规防水补漏公司优选口碑榜测评推荐 - 即刻修防水
  • 高频问答加语义缓存不走模型