FolderNameEditor.使用FolderBrowserStyles.ShowTextBox -自动创建新的文件

本文关键字:创建 文件 使用 FolderBrowserStyles ShowTextBox FolderNameEditor | 更新日期: 2023-09-27 18:09:08

我在我的应用程序中向用户显示一个文件夹浏览器,然后用ShowDialog()来促进他,其中有m_dialog。Style = folderbrowserstyle . showtextbox;因此,允许用户手动输入他想要选择的文件夹的路径。

问题是,当用户为不存在的文件夹键入路径并单击OK时,对话框返回一些默认的DirectoryPath值。我想要的是要创建的选定文件夹(如果它不存在,并且首先通过提升用户),然后在DirectoryPath属性中拥有(现在有效的)路径。

有办法吗?

FolderNameEditor.使用FolderBrowserStyles.ShowTextBox -自动创建新的文件

FolderNameEditor。FolderBrowser类使用SHBrowseForFolder shell函数。基于用户输入无效路径的默认功能是返回默认选择项(在本例中是Desktop文件夹)。

SHBrowseForFolder shell函数需要一个BROWSEINFO (structure)类型的参数。

这个结构允许定义一个回调函数(一个指向应用程序定义的函数的指针,当一个事件发生时,对话框会调用这个函数),在这个回调中有可能实现你所需要的。

当FolderBrowser调用这个shell函数时,这个回调函数被设置为null,所以没有可能的方法来实现使用FolderNameEditor类所需要的。

然而,在codeproject上有一个库,你可以使用它使用SHBrowseForFolder并包装事件回调,通过事件(OnValidateFailed)提供对无效文件夹条目的访问。参见:c#做Shell,第1部分

在此事件中(经过一些验证(因为用户可以输入任何内容)),您可以使用输入的路径来创建目录。

下面是一个例子:

using ShellLib;
...
public class OpenFolderDialog
{
    ShellBrowseForFolderDialog folderDialog;
    string selectedPath;
    public OpenFolderDialog()
    {
        folderDialog = new ShellBrowseForFolderDialog();
        folderDialog.OnValidateFailed += new ShellBrowseForFolderDialog.ValidateFailedHandler(dialog_OnValidateFailed);
    }
    int dialog_OnValidateFailed(ShellBrowseForFolderDialog sender, ShellBrowseForFolderDialog.ValidateFailedEventArgs args)
    {
        selectedPath = args.invalidSel;
        //Use selectedPath here to create the directory.
        return 0;
    }
    public string GetFolder()
    {
        selectedPath = string.Empty;
        folderDialog.ShowDialog();
        return selectedPath == string.Empty ? folderDialog.FullName : selectedPath;
    }
}