이전 포스팅에서는 폴더 정보가 표시될 TreeView에 임의의 데이터를 넣었습니다. 이번에는 실제 Windows 폴더 정보를 TreeView에 채우겠습니다. 드라이브 정보를 구하고 각 드라이브의 폴더를 재귀함수로 돌면서 다중 트리를 생성합니다.
그리고 TreeView와 DataBinding 된 ViewModel을 통해 TreeView에 폴더가 표시됩니다.
✅ TreeView에 실제 폴더 보여주기
GetAllDirectoryFromDrive()
private void GetAllDirectoryFromDrive()
{
DirectoryTree? tree = DirectoryTreeVM.DirectoryTreeCollection;
DriveInfo[] allDrives = DriveInfo.GetDrives();
foreach (DriveInfo dname in allDrives)
{
if (dname.DriveType == DriveType.Fixed)
{
tree?.Root.AddChild(new DirectoryInfoViewModel() { Name = dname.Name });
GetAllDirectoryFromDirectory(tree?.Root.Children.Last(), dname.Name);
}
}
}
DriveInfo.GetDrives() 함수로 현재 Mounting 된 Drive정보를 가져옵니다.
foreach로 모든 Drive의 Directory 탐색을 시작합니다.
GetAllDirectoryFromDriectory()
private void GetAllDirectoryFromDirectory(DirectoryTreeNode? node, string directory)
{
var directoryList = Directory.GetDirectories(directory);
foreach (string dir in directoryList)
{
try
{
DirectoryInfo di = new DirectoryInfo(dir);
if (di.Attributes.HasFlag(FileAttributes.System))
continue;
node?.AddChild(new DirectoryInfoViewModel() { Name = Path.GetFileName(dir) });
GetAllDirectoryFromDirectory(node?.Children.Last(), dir);
}
catch (System.UnauthorizedAccessException)
{
continue;
}
}
}
인자로 마지막에 추가된 Directory에 하위 Directory를 찾아서 자식으로 추가합니다.
이어서 새로 추가된 자식의 하위 Directory를 찾는 재귀호출이 이루어집니다.
try - catch 문에서는 권한 문제로 접근할 수 없는 폴더는 UnauthorizedAccessException이 발생하기 때문에 예외처리를 합니다. 예외가 발생하면 다음 Directory를 계속 탐색합니다.
결과
실행하면 화면에 나타날 때까지 제법 시간이 걸립니다.
Windows는 기본적으로 폴더가 매우 많기 때문에 한 번에 모든 폴더 정보를 가져오는 것은 시간이 오래 걸립니다.
하지만 실제 파일 탐색기는 빠르게 동작합니다. 폴더 정보가 필요할 때 필요한 만큼의 폴더 정보만 가져오기 때문입니다.
다음 포스팅에서는 필요한 경우에만 폴더 정보를 가져오도록 수정하겠습니다.
✅ TreeView에 실제 폴더 보여주기 - 끝