(C#)Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹
1 - 基础,浏览一个文件夹
我们知道,在win32中是以外壳名字空间的形式来组织文件系统的,在外壳名字空间里的每一个对象(注)都实现了一个IShellFolder的接口,通过这个接口我们可以直接查询或间接得到其他相关的接口。
(注:这里的对象指的是外壳名字空间中的一个节点,对象有可能是一个文件夹,有可能是一个文件,也有可能是一个虚拟文件夹,例如:我的电脑,网上邻居,控制面板等)
在C#中,我们这样定义 IShellFolder 接口:
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/ExpandedBlockStart.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/ExpandedBlockStart.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/InBlock.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/InBlock.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/InBlock.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/InBlock.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/ExpandedSubBlockStart.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/ExpandedSubBlockEnd.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/ExpandedBlockEnd.gif)
当然,这个接口还没有列出细节函数。我们要做的仅仅是从最基础开始。
首先我们必须了解,在外壳编程中,要使用 PIDL 路径代替普通路径(如果对 PIDL 不熟悉,请看Windows外壳名字空间的浏览)。
“桌面”是最顶级的文件夹,外壳名字空间中其他各项都可以用从“桌面”开始的 PIDL 加以表示。
如何获取“桌面”的 PIDL 和其 IShellFolder 接口呢,可以通过 API SHGetDesktopFolder:
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/ExpandedBlockStart.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/InBlock.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/ExpandedBlockEnd.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/ExpandedBlockStart.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/InBlock.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/InBlock.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/InBlock.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/ExpandedBlockEnd.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
好的,我们取得“桌面”的 IShellFolder 接口,就已经成功了一半。现在我需要通过“桌面”,来获取“C:\”这个路径的 PIDL 和 IShellFolder 接口,可以通过 IShellFolder 的 ParseDisplayName 和 BindToObject 函数来实现:
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
前提是你应该保证路径存在,因为我没有做任何出错控制。这样我们就获得了一个 Root,它表示C盘。通过这个Root,我们可以用 EnumObjects 来循环获取其子项(子文件和子文件夹):
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/ExpandedBlockStart.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/InBlock.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/InBlock.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/ExpandedSubBlockStart.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/InBlock.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/InBlock.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/InBlock.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/ExpandedSubBlockEnd.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/ExpandedBlockEnd.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/None.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/ExpandedBlockStart.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/InBlock.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/InBlock.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/ExpandedSubBlockStart.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/InBlock.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/InBlock.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/ExpandedSubBlockEnd.gif)
Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 - 柠檬的 - 博客园_files/ExpandedBlockEnd.gif)
事实上,代码到此结束。然而我发现有太多的结构体和枚举没有介绍(以后会有更多),有兴趣的朋友可以等待我下一节介绍
(C#)Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹的更多相关文章
- (C#)Windows Shell 外壳编程系列2 - 解释,从“桌面”开始展开
(本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一篇:(C#)Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 让我们详细解释一下 Shell 编程中最基本 ...
- (C#)Windows Shell 外壳编程系列8 - 同后缀名不同图标?
原文 (C#)Windows Shell 外壳编程系列8 - 同后缀名不同图标? (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:(C#)Windows Shell 外壳 ...
- (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
原文 (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:(C#)Windows She ...
- (C#)Windows Shell 外壳编程系列7 - ContextMenu 注册文件右键菜单
原文 (C#)Windows Shell 外壳编程系列7 - ContextMenu 注册文件右键菜单 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:(C#)Windo ...
- (C#)Windows Shell 外壳编程系列6 - 执行
原文(C#)Windows Shell 外壳编程系列6 - 执行 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:(C#)Windows Shell 外壳编程系列5 - ...
- (C#)Windows Shell 外壳编程系列5 - 获取图标
(本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:(C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令 有 ...
- (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令
(本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:(C#)Windows Shell 外壳编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单 上一节说到如 ...
- (C#)Windows Shell 外壳编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单
(本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:(C#)Windows Shell 外壳编程系列2 - 解释,从“桌面”开始展开 这里解释上一节中获取名称的方法 GetD ...
- (C#)Windows Shell 编程系列1 - 基础,浏览一个文件夹
原文 (C#)Windows Shell 编程系列1 - 基础,浏览一个文件夹 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) Windows Shell 编程,即 Windows ...
随机推荐
- bzoj 3373: [Usaco2004 Mar]Lying Livestock 说谎的牲畜
3373: [Usaco2004 Mar]Lying Livestock 说谎的牲畜 Description 兽群中总是有一些麻烦制造者.约翰知道他的N(1≤N≤100)头奶牛中有一头总是说谎,其他的 ...
- 一种计算MD5的实现方法
1.在需要用到加密的地方可以使用.net中的md5相关的类生成md5给文件加密. 2.基本思路: 将文件也好,字符串也好,转成字节数组,再利用.net的md5相关类生成md5相关字符串,再将字符串转成 ...
- zk常见面试题
一个客户端修改了某个节点的数据,其它客户端能够马上获取到这个最新数据吗 ZooKeeper不能确保任何客户端能够获取(即Read Request)到一样的数据,除非客户端自己要求:方法是客户端在获取数 ...
- Objective-C]入门 (xcode helloworld程序 创建类
一:objective-c简介 Objective-C是进行iPhone软件开发的语言 Objective-C语言是C语言的一个扩展集 Objective-C是一种面向对象的语言 大小写敏感 程序语句 ...
- python接口自动化21-规范的API接口文档示例
前言 接口文档到底长啥样?做接口测试最大的障碍在于没有接口文档,很多公司不注重接口文档的编写,导致测试小伙伴没见过接口文档. 运气好一点的测试小伙伴可能厚着脸皮找开发要过接口文档,然而拿过来的接口文档 ...
- c++类模板template中的typename使用方法-超级棒
转载:https://blog.csdn.net/vanturman/article/details/80269081 如有问题请联系我删除: 目录 起因 typename的常见用法 typename ...
- Nginx部署前端代码实现前后端分离
实现前后端分离,可以让前后端独立开发.独立部署.独立单测,双方通过JSON进行数据交互. 对于前端开发人员来说,不用每次调试都需要启动或配置Java/Tomcat运行环境:对于后端开发人员来说 ,也不 ...
- Akka概念集
(转)http://www.csdn.net/article/2014-12-17/2823174 在Akka里面,和Actor通信的唯一方式就是通过ActorRef.ActorRef代表Actor的 ...
- 以JPanel为基础实现一个图像框
代码: import java.awt.Graphics; import javax.swing.ImageIcon; import javax.swing.JPanel; public class ...
- CentOS下配置HTTPS訪问主机并绑定訪问port号
系统环境: Linux: CentOS release 6.5 (Final) LAMP 步骤 1.lamp开启ssl # yum install openssl mod_ssl -y # 安装ope ...