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?而非
DialogResultWPF 中不能直接在后台线程调用
ShowDialog(),会报“调用线程必须为 STA”——需确保在 UI 线程执行,或用
Dispatcher.Invoke两者都不支持自定义模板或嵌入控件,如需高度定制化保存界面,得手写窗口 +
FolderBrowserDialog+ 文件名输入框组合 实际写入前务必确认路径合法、目录可写、扩展名匹配 Filter 设置,这些环节出错往往比弹窗本身更难定位。
