SaveFileDialog仅获取保存路径而不执行文件写入。需先判断ShowDialog()返回值是否为DialogResult.OK,再用File.WriteAllText等手动写入;设置Filter、InitialDirectory、FileName可定制对话框行为,OverwritePrompt=true启用覆盖提示,但文件存在检查与重命名需自行实现。

SaveFileDialog 基本用法
直接创建 SaveFileDialog 实例,调用 ShowDialog() 弹出窗口,用户确认后通过 FileName 获取选中的路径。关键点是:它不自动保存文件,只负责获取路径。
- 必须检查返回值是否为
DialogResult.OK,否则用户点了取消或关闭,FileName可能为空或无效 -
Filter属性决定下拉列表中显示的文件类型,格式为"显示名|*.扩展名",例如"文本文件|*.txt|所有文件|*.*" - 设置
InitialDirectory可指定默认打开位置,不设则通常为上次访问目录或系统文档目录 - 设置
FileName初始值可预填文件名(不含路径),比如dialog.FileName = "report.txt";
常见错误:点了保存但文件没写入
这是最常被忽略的一点:SaveFileDialog 本身不做任何 I/O 操作。弹窗只是帮你拿到路径字符串,后续得自己用 File.WriteAllText、FileStream 等写入内容。
- 错误写法:
dialog.ShowDialog(); File.WriteAllText(dialog.FileName, content);—— 没判断是否点了 OK,可能对空字符串写入导致异常 - 正确顺序:先
if (dialog.ShowDialog() == DialogResult.OK),再执行写入逻辑 - 注意权限问题:用户选了系统受保护路径(如
C:\Windows),写入会抛UnauthorizedAccessException,应捕获并提示
避免覆盖已有文件的提示
默认情况下,SaveFileDialog 不会阻止用户输入已存在文件名。要启用“文件已存在时询问”功能,需设置 OverwritePrompt = true。
- 该选项只影响对话框行为,不自动处理重命名或跳过;用户仍可点“否”取消保存
- 若还需“检查文件是否存在并建议编号”这类逻辑(如
report (1).txt),得手动实现,SaveFileDialog不提供 -
CheckPathExists和CheckFileExists是只读校验开关,前者检查路径是否存在,后者在打开模式下检查文件是否存在(保存模式下无意义)
WinForms 与 WPF 的区别
WinForms 直接用 System.Windows.Forms.SaveFileDialog;WPF 默认没有内置等价类,得用 Microsoft.Win32.SaveFileDialog(位于 PresentationFramework 程序集)。
- WPF 版本 API 高度相似,也有
Filter、FileName、ShowDialog(),但返回的是bool?而非DialogResult - WPF 中不能直接在后台线程调用
ShowDialog(),会报“调用线程必须为 STA”——需确保在 UI 线程执行,或用Dispatcher.Invoke - 两者都不支持自定义模板或嵌入控件,如需高度定制化保存界面,得手写窗口 +
FolderBrowserDialog+ 文件名输入框组合










