2012-10-18 74 views
3

FolderBrowserDialog.RootFolder Property仅限于在Environment.SpecialFolder枚举器中定义的特殊文件夹。但是,在我的应用程序中,我们需要显示此对话框,但根路径需要可配置,通常是一个自定义文件夹,与枚举器中的任何特殊文件夹无关。是否可以将非特殊文件夹用作FolderBrowserDialog的根文件夹?

如何显示文件夹浏览器的根分配给自定义文件夹?也许这对RootFolder属性是不可能的,但是可能通过其他方式产生相同的效果(即,用户无法在根文件夹之外查看或选择)。在this answer中,有人暗示可能使用反射操作,但没有更新。任何想法,如果这可能在.NET中?

回答

2

我写了这个解决方案,基于ParkerJay86的this solution。该解决方案在多个测试路径的Windows 8上运行。考虑你指定的RootFolder应该以DriveLetter:\开头,如“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; 
    } 
} 
相关问题