C#保存文件对话框用法 C#如何弹出窗口让用户保存文件

来源:这里教程网 时间:2026-02-21 17:41:12 作者:

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
+ 文件名输入框组合
实际写入前务必确认路径合法、目录可写、扩展名匹配 Filter 设置,这些环节出错往往比弹窗本身更难定位。

相关推荐