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

使用C#与Shell32遍历Android设备时的FolderItem转Folder问题

解决Shell32中FolderItem转Folder实现递归遍历的问题

嘿,我来帮你搞定这个Shell32递归遍历的问题!你现在卡壳在FolderItem转Folder这一步对吧?其实核心是要先判断当前项是不是文件夹,再用正确的方法转换,这样就能顺利遍历所有设备——不管是带盘符的C盘、D盘,还是像安卓平板这种无盘符的连接设备。

关键修正思路

不是所有FolderItem都能直接强转为Folder,只有当项本身是文件夹类型时,才能通过GetFolder()方法获取对应的Folder对象,以此实现递归遍历。下面是修正后的完整代码:

using Shell32; // 引用路径:C:\Windows\System32\shell32.dll

class FolderTraverser
{
    public int Hwnd { get; private set; }

    public void ListAllFolderObjects()
    {
        Shell32.Shell shell = new Shell32.Shell();
        
        // 获取Shell命名空间根容器,包含所有存储设备(含无盘符设备)
        Folder rootContainer = shell.NameSpace(0);
        foreach (FolderItem item in rootContainer.Items())
        {
            TraverseFolderItem(item, 0);
        }
    }

    private void TraverseFolderItem(FolderItem folderItem, int depth)
    {
        // 用缩进显示文件夹层级,方便查看结构
        Console.WriteLine($"{new string(' ', depth * 2)}{folderItem.Name}");

        // 仅处理文件夹类型的项,避免非文件夹转换报错
        if (folderItem.IsFolder)
        {
            // 安全转换FolderItem为Folder,失败返回null而非抛出异常
            Folder subFolder = folderItem.GetFolder() as Folder;
            if (subFolder != null)
            {
                // 递归遍历子文件夹/子项
                foreach (FolderItem subItem in subFolder.Items())
                {
                    TraverseFolderItem(subItem, depth + 1);
                }
            }
        }
    }
}

重要注意事项

  • 先判断文件夹类型:转换前必须检查folderItem.IsFolder属性,跳过文件或非文件夹类型的项,避免转换失败抛出异常。
  • 使用GetFolder()安全转换:不要直接强制类型转换(比如(Folder)folderItem),调用GetFolder()再配合as运算符,能确保转换失败时得到null,程序不会崩溃。
  • 平台目标设置:Shell32.dll是64位组件,要确保你的项目平台目标设置为x64或者Any CPU(禁用“首选32位”选项),否则会出现兼容性错误。
  • 根容器遍历:shell.NameSpace(0)会获取Shell命名空间的根,这里包含了所有已连接的存储设备,比仅遍历驱动器字母更全面,能覆盖安卓平板这类无盘符设备。

内容的提问来源于stack exchange,提问作者user3535647

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:41:55