如何使用C#编程访问Windows系统的「此电脑」目录?
C# 访问Windows「此电脑」目录的实现方法
首先明确核心前提:Windows系统中的「此电脑」(旧称「我的电脑」)不属于文件系统中的实体目录,是Windows Shell命名空间下的虚拟节点,不存在传统的文件系统路径,因此无法直接通过Directory、DriveInfo这类仅支持实体文件系统路径的API访问,需要通过Shell相关接口操作。
可行实现方案
方案1:通过Shell COM对象访问(推荐,和资源管理器展示内容完全一致)
「此电脑」对应的Shell解析名为固定CLSID路径:::{20D04FE0-3AEA-1069-A2D8-08002B30309D},可以直接通过Shell.Application COM对象拿到节点引用,枚举内部所有项。
- 无COM引用的动态实现(兼容.NET Framework/.NET Core/.NET 5+,无需手动添加引用)
// 从ProgID创建Shell应用实例 Type shellType = Type.GetTypeFromProgID("Shell.Application"); dynamic shellApp = Activator.CreateInstance(shellType); // 传入此电脑的CLSID路径,获取对应文件夹对象 dynamic thisPcNode = shellApp.NameSpace("::{20D04FE0-3AEA-1069-A2D8-08002B30309D}"); // 枚举此电脑下所有可见项 foreach (dynamic item in thisPcNode.Items()) { // 可获取项的名称、类型、实体路径等属性 Console.WriteLine($"项名称:{item.Name},项类型:{item.Type},对应路径:{item.Path}"); }
- 如果需要强类型开发,可以手动添加COM引用「Microsoft Shell Controls and Automation」,用强类型的
Shell、Folder、FolderItem类替代动态类型,开发时可以获得智能提示。
这种方式拿到的枚举结果和资源管理器打开「此电脑」看到的内容完全一致,除了DriveInfo.GetDrives()能获取到的本地硬盘、光驱、可移动存储外,还能拿到钉在此电脑下的用户文件夹(文档、下载、图片等)、映射网络驱动器、网络位置等非驱动器虚拟项。
注意事项
- 不要将此电脑的CLSID路径传入
Directory、DirectoryInfo、File等传统文件IO类,这类API仅支持实体文件系统路径,传入虚拟路径会直接抛出路径不合法的异常。 - 如果仅需要获取驱动器列表,
DriveInfo.GetDrives()已经足够;如果需要完全复刻资源管理器「此电脑」层级的展示内容,必须使用Shell接口方案。
内容的提问来源于stack exchange,提问作者Kg Ro
相关产品推荐
相关产品推荐

