2012-10-18 2 views
3

FolderBrowserDialog.RootFolder PropertyEnvironment.SpecialFolder 열거 자에 정의 된 특수 폴더로만 제한됩니다. 그러나 내 응용 프로그램에서는이 대화 상자를 표시해야하지만 루트 경로는 구성 가능해야하며 일반적으로 열거 자의 특수 폴더와 관련이없는 사용자 지정 폴더입니다.비 특수 폴더를 FolderBrowserDialog의 루트 폴더로 사용할 수 있습니까?

어떻게 사용자 지정 폴더에 루트가 할당 된 폴더 브라우저를 표시 할 수 있습니까? 아마 RootFolder 속성으로는 불가능할 수도 있지만, 다른 방법 (예 : 사용자가 루트 폴더 외부에서 보거나 선택할 수 없음)으로 동일한 효과를 얻을 수 있습니다. this answer에서 누군가는 반사 조작을 사용하여 가능할 수도 있음을 암시했지만 업데이트가 없었습니다. 이것이 .NET에서 가능한지 어떤 생각입니까?

답변

2

나는이 솔루션을 ParkerJay86의 this solution에 기반하여 작성했습니다. 이 솔루션은 Windows 8에서 여러 경로의 테스트를 거쳤습니다. 지정한 rootFolder가 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; 
    } 
}