使 SaveFileDialog 不在用户选择的目录中创建测试文件
Posted
技术标签:
【中文标题】使 SaveFileDialog 不在用户选择的目录中创建测试文件【英文标题】:Make SaveFileDialog to NOT create a test file in the directory selected by user 【发布时间】:2014-04-16 21:37:38 【问题描述】:我们的用户有时会使用不允许删除文件的目录。 (文件系统权限 Delete 和 Delete subfolders and files 都被拒绝)。我们使用 System.Windows.Forms.SaveFileDialog 来允许用户选择目录并提供文件名来保存他们的数据。
如果用户浏览到没有删除权限的目录,则在按下 SaveFileDialog 的 Save 按钮时会收到以下错误消息:
您无权修改此网络位置中的文件。 根据权限联系管理员以进行这些更改。
除了这个不需要的消息之外,当用户在对话框中按取消时,具有用户指定名称的零长度文件将留在目录中。
这一切都是因为默认情况下 SaveFileDialog 通过在其中创建一个零长度文件来探测目录。探测完成后,它会删除临时文件。在我们的例子中它不能删除(因为文件系统不允许删除),并且整个探测被对话框认为是失败的,并且向用户显示错误消息。
关闭此目录验证步骤的最简单方法是什么?我知道可以使用 SaveFileDialog 的属性(即 CheckFileExist 属性)关闭其他导致消息的标准检查,但似乎不是这个。
【问题讨论】:
您尝试过较新的文件对话框 (CommonSaveFileDialog) 吗?它们可通过 Windows API 代码包访问:nuget.org/packages/WindowsAPICodePack-Shell 【参考方案1】:将对话框的SaveFileDialog.InitialDirectory
属性设置为您知道用户在显示之前具有写入权限的目录的值。
【讨论】:
用户有 Write 访问感兴趣的目录。他们没有在此目录中删除的权限,他们愿意接受此限制。换句话说,他们可以只在目录中创建文件。当他们想要删除时,他们需要请其他具有更高权限的人审查他们的决定,如果获得批准则删除。 所以根据我的评论,除了用“写访问”代替“删除访问”?【参考方案2】:尝试处理SaveFileDialog.FileOK
事件。它具有CancelEventArgs
作为第二个参数,因此您可以验证所需的目录是否可以删除并设置e.Cancel = true
,如果不是。
示例代码:
using (SaveFileDialog dlg = new SaveFileDialog())
dlg.FileOk += (sender, e) => e.Cancel = !DirectoryIsGood(dlg.FileName);
dlg.ShowDialog(this);
请注意,您需要创建 DirectoryIsGood(filename)
方法,该方法应通过给定的 filename
检查目录。我不确定此事件是否在 SaveFileDialog
内部之前触发检查,但你尝试一下是有意义的。也许会有所帮助。
【讨论】:
【参考方案3】:默认情况下,对话框会创建一个长度为零的测试文件,以确定是否可以在所选目录中创建新文件。要防止创建此测试文件,请设置 OFN_NOTESTFILECREATE 标志。
【讨论】:
以上是关于使 SaveFileDialog 不在用户选择的目录中创建测试文件的主要内容,如果未能解决你的问题,请参考以下文章
c# savefiledialog 锁定到特定目录? [复制]