Is it possible to use non-special folder as a FolderBrowserDialog's root folder?

前端 未结 1 1475
逝去的感伤
逝去的感伤 2021-01-20 17:39

FolderBrowserDialog.RootFolder Property is restricted to only special folder defined in the Environment.SpecialFolder enumerator. However in my applciation, we need to show

相关标签:
1条回答
  • 2021-01-20 18:13

    I wrote this solution based on this solution by ParkerJay86. The solution worked on Windows 8 with several paths tested. Consider that your specified rootFolder should start with DriveLetter:\ like "C:\ProgramData"

        private void browseFolder_Click(object sender, EventArgs e)
        {
            String selectedPath;
            if (ShowFBD(@"C:\", "Please Select a folder", out selectedPath))
            {
                MessageBox.Show(selectedPath);
            }
        }
    
    public bool ShowFBD(String rootFolder, String title, out String selectedPath)
    {
        var shellType = Type.GetTypeFromProgID("Shell.Application");
        var shell = Activator.CreateInstance(shellType);
        var result = shellType.InvokeMember("BrowseForFolder", BindingFlags.InvokeMethod, null, shell, new object[] { 0, title, 0, rootFolder });
        if (result == null)
        {
            selectedPath = "";
            return false;
        }
        else
        {
            StringBuilder sb = new StringBuilder();
            while (result != null)
            {
                var folderName = result.GetType().InvokeMember("Title", BindingFlags.GetProperty, null, result, null).ToString();
                sb.Insert(0, String.Format(@"{0}\", folderName));
                result = result.GetType().InvokeMember("ParentFolder", BindingFlags.GetProperty, null, result, null);
            }
            selectedPath = sb.ToString();
    
            selectedPath = Regex.Replace(selectedPath, @"Desktop\\Computer\\.*\(\w:\)\\", rootFolder.Substring(0, 3));
            return true;
        }
    }
    
    0 讨论(0)
提交回复
热议问题