使 SaveFileDialog 不在用户选择的目录中创建测试文件

Posted

技术标签:

【中文标题】使 SaveFileDialog 不在用户选择的目录中创建测试文件【英文标题】:Make SaveFileDialog to NOT create a test file in the directory selected by user 【发布时间】:2014-04-16 21:37:38 【问题描述】:

我们的用户有时会使用不允许删除文件的目录。 (文件系统权限 DeleteDelete 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 不在用户选择的目录中创建测试文件的主要内容,如果未能解决你的问题,请参考以下文章

SaveFileDialog 保存按钮事件

c# savefiledialog 锁定到特定目录? [复制]

禁用 savefiledialog 的文件名框

System.Windows.Forms.SaveFileDialog 不强制执行默认扩展名

SaveFileDialog 上的自定义检查文件名

如何使用 SaveFileDialog 将字符串生成器的内容保存到文本文件?