如何在自定义Tree Folder对话框中移除系统隐藏文件夹
解决自定义TreeView文件夹对话框中移除系统隐藏文件夹的问题

没问题,我来帮你搞定这个需求!你的现有代码只是初始化了驱动器节点,还没有实现文件夹的加载逻辑——要过滤掉$开头的系统隐藏文件夹(比如回收站),我们需要在加载子文件夹节点的环节添加过滤条件。
步骤1:添加TreeView展开事件处理
TreeView通常是在用户展开节点时才加载子文件夹,所以我们需要给TreeView绑定BeforeExpand事件,在事件触发时加载子节点并过滤掉目标文件夹。
步骤2:编写递归加载子节点的方法
在加载子节点时,我们需要过滤两种类型的目录:
- 名称以
$开头的系统目录(比如回收站$Recycle.Bin) - 同时带有
Hidden和System属性的隐藏系统目录
以下是修改和补充后的完整代码:
public bool CreateTree(TreeView treeView) { bool returnValue = false; try { // 注册展开事件,用于加载子节点 treeView.BeforeExpand += TreeView_BeforeExpand; // Create Desktop TreeNode TreeNode desktop = new TreeNode(); desktop.Text = "Desktop"; desktop.Tag = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); desktop.Nodes.Add(""); // 占位节点,触发展开事件 treeView.Nodes.Add(desktop); // Get driveInfo foreach (DriveInfo drv in DriveInfo.GetDrives()) { if (!drv.IsReady) continue; // 跳过未就绪的驱动器 TreeNode fChild = new TreeNode(); if (drv.DriveType == DriveType.CDRom) { fChild.ImageIndex = 1; fChild.SelectedImageIndex = 1; } else if (drv.DriveType == DriveType.Fixed) { fChild.ImageIndex = 0; fChild.SelectedImageIndex = 0; } fChild.Text = drv.Name; fChild.Tag = drv.RootDirectory.FullName; fChild.Nodes.Add(""); // 占位节点 treeView.Nodes.Add(fChild); returnValue = true; } } catch (Exception ex) { returnValue = false; MessageBox.Show(ex.Message); } return returnValue; } // TreeView展开事件处理方法 private void TreeView_BeforeExpand(object sender, TreeViewCancelEventArgs e) { TreeNode currentNode = e.Node; // 先清除占位节点 currentNode.Nodes.Clear(); try { string path = currentNode.Tag.ToString(); DirectoryInfo dirInfo = new DirectoryInfo(path); foreach (DirectoryInfo subDir in dirInfo.GetDirectories()) { // 过滤条件:排除$开头的目录,以及隐藏系统目录 bool isSystemHiddenDir = (subDir.Attributes & (FileAttributes.Hidden | FileAttributes.System)) == (FileAttributes.Hidden | FileAttributes.System); bool startsWithDollar = subDir.Name.StartsWith("$"); if (!isSystemHiddenDir && !startsWithDollar) { TreeNode subNode = new TreeNode(subDir.Name); subNode.Tag = subDir.FullName; subNode.Nodes.Add(""); // 添加占位节点,触发后续展开 // 这里可以根据需要设置图片索引 subNode.ImageIndex = 0; subNode.SelectedImageIndex = 0; currentNode.Nodes.Add(subNode); } } } catch (UnauthorizedAccessException) { // 处理无权访问的目录,比如系统保护目录 TreeNode noAccessNode = new TreeNode("无法访问"); noAccessNode.ForeColor = Color.Gray; currentNode.Nodes.Add(noAccessNode); } catch (Exception ex) { MessageBox.Show($"加载文件夹出错:{ex.Message}"); } }
代码说明:
- 修改CreateTree方法:给TreeView绑定
BeforeExpand事件,给每个节点的Tag存储实际路径,并添加占位节点触发展开事件。 - 过滤逻辑:在
TreeView_BeforeExpand方法中,通过DirectoryInfo的属性和名称判断,排除$开头的目录以及同时带有Hidden和System属性的目录。 - 异常处理:增加了无权访问目录的处理,避免程序因权限问题崩溃。
这样修改后,你的自定义TreeView对话框就不会显示$开头的系统隐藏文件夹了。
内容的提问来源于stack exchange,提问作者Zujaj Misbah Khan
相关产品推荐
相关产品推荐

