Intereting Posts

Можно ли использовать неспециальную папку в качестве корневой папки FolderBrowserDialog?

Свойство FolderBrowserDialog.RootFolder ограничено только специальной папкой, определенной в редакторе Environment.SpecialFolder . Однако в моем приложении нам нужно показать это диалоговое окно, но корневой путь необходимо настроить и обычно это настраиваемая папка, не связанная с какой-либо специальной папкой в ​​перечислителе.

Как показать браузер папок с корнем, назначенным в пользовательскую папку? Возможно, это невозможно с использованием свойства RootFolder, но возможно ли иметь тот же эффект другими способами (т.е. пользователь не может просматривать или выбирать вне корневой папки). В этом ответе кто-то намекнул, что это возможно с помощью манипуляции reflectionм, но обновления не было. Любая идея, если это возможно в .NET?

Я написал это решение на основе этого решения от ParkerJay86. Решение работало в Windows 8 с несколькими проверенными путями. Учтите, что указанный вами rootFolder должен начинаться с 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; } }