使用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
相关产品推荐
相关产品推荐

