2012-10-18 72 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; 
    } 
} 
相關問題