You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在自定义Tree Folder对话框中移除系统隐藏文件夹

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

Remove Hidden Files from Custom TreeFolder Dialog

没问题,我来帮你搞定这个需求!你的现有代码只是初始化了驱动器节点,还没有实现文件夹的加载逻辑——要过滤掉$开头的系统隐藏文件夹(比如回收站),我们需要在加载子文件夹节点的环节添加过滤条件。

步骤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}");
    }
}

代码说明:

  1. 修改CreateTree方法:给TreeView绑定BeforeExpand事件,给每个节点的Tag存储实际路径,并添加占位节点触发展开事件。
  2. 过滤逻辑:在TreeView_BeforeExpand方法中,通过DirectoryInfo的属性和名称判断,排除$开头的目录以及同时带有Hidden和System属性的目录。
  3. 异常处理:增加了无权访问目录的处理,避免程序因权限问题崩溃。

这样修改后,你的自定义TreeView对话框就不会显示$开头的系统隐藏文件夹了。

内容的提问来源于stack exchange,提问作者Zujaj Misbah Khan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:02:27