(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 ...
随机推荐
- 【c++随手记】编程基础之输入输出
今天试了下noi oj的1.1节,随便总结一下. [cout左对齐右对齐的方法] #include<iostream> #include<cstdio> #include< ...
- [WikiOI "天梯"1281] Xn数列
题目描述Description 给你6个数,m, a, c, x0, n, g Xn+1 = ( aXn + c ) mod m,求Xn m, a, c, x0, n, g<=10^18 输入描 ...
- [转]java框架spring中的opensessioninview有什么作用
在hibernate中使用load方法时,并未把数据真正获取时就关闭了session,当我们真正想获取数据时会迫使load加载数据,而此时 session已关闭,所以就会出现异常. 比较典型的是在MV ...
- NFS迁移
Auth: Jin Date: 20140317 需求将NFS共享IP切换为192.168.201.221,通过192.168.201.0网段提供共享(10.0.0.0和192.168.201.0都能 ...
- mysql设置远程访问密码
mysql -u root -p Aaa111222 grant all privileges on *.* to root@'%' identified by 'aaa111222; Quit ln ...
- 让Code First下的数据库的迁移更加简单
Code First给我们的程序开发带了很多便利,之前的版本中一个比较不大方便的地方是数据库迁移,麻烦不说,往往还和上下文相关,在不同的版本之间的数据库进行迁移还很容易失败,并且一旦失败还不大容易找到 ...
- 几本推荐的Java书
一.<深入理解Java虚拟机:JVM高级特性与最佳实践> 如果你不满足于做一个只会写if…else…的Java程序员,而是希望更进一步,我随便举几个例子吧: 1.了解Java代码的底层运行 ...
- rocketmq持久化方式
推荐看下RocketMQ,使用文件做持久化, 并支持分布式事务(虽然可能造成较多的写脏), 异步刷盘,内存预分配, 高可用采用了同步双写及异步复制的方式, 通信是用netty做的,基本上所有耗时的操作 ...
- WinCE5.0开发环境的建立
目前WinCE5.0的开发工具主要有以下几种:Platform Builder5.0.EVC4.0+SP4.Visual Studio2005.其中Platform Builder主要用于定制WinC ...
- BOOST 实用手册(摘录自校友博客)
1. 序言 现在学的东西很容易忘记,写这篇文章的目的是能让我在需要时快速找回当时的感觉. Let's BOOST THE WORLD . 2. 编译:VC2005注意 在 属性->C/C++- ...