取得文件夹内容信息
来源:互联网 发布:ip端口扫描器安卓版 编辑:程序博客网 时间:2024/06/05 06:12
翻译自MSDN 2005 -> Win32和 COM 开发 -> User Interface -> WindowsUser Experience -> Windows Shell ->Shell Programmer's Guide -> Shell Basics-> Shell Basics: Programming the Shell-> Getting Information About the Contents of aFolder
Getting a Folder's ID讨论了两种获取Shell对象PIDL的方法。一个显然的问题是:获取PIDL后,可以用它做什么?一个相关问题是:哪种方法可以用于你的程序,或者适合你的程序?要回答这两个问题需要更深入考察下名字空间是如何实现的。名字空间实现的关键是IShellFolder接口。
使用IShellFolder接口
前面的文档中,名字空间文件夹被称作“对象”。这个术语的使用好像不太严格,但实际上从严格意义上讲,这个术语也是合适的,因为每个名字空间文件夹都由一个COM对象表示。每个文件夹对象实现了很多可以用于各种任务的接口。有些接口是可选的,不是每个文件夹都实现了,但每个文件夹都必须实现基本接口IShellFolder。
要使用文件夹,首先需要获取其IShellFolder接口指针。IShellFolder接口指针除了可以提供对对象其他接口的访问外,还提供了处理很多通常任务的方法,本文将讨论某些通常任务。
要获取Shell对象的IShellFolder接口指针,首先调用SHGetDesktopFolder,它会返回名字空间根,即桌面的IShellFolder接口指针。获取了桌面对象的IShellFolder接口指针后,有很多方法进行下一步。
如果已经有要处理的文件夹的PIDL了(比如说,通过SHGetFolderLocation获取的),可以用桌面对象的(IShellFolder接口指针的)BindToObject方法获取文件夹的IShellFolder接口指针。如果已经有文件系统对象的路径了,可以先用桌面对象的ParseDisplayName方法获取其PIDL,然后再调用BindToObject。如果这两种方法都不可用,可以用IShellFolder的其他方法浏览名字空间(并定位到要处理的文件夹),详情请参考Navigatingthe Namespace。
枚举文件夹内容
文件夹处理的第一件事通常是看看它包含什么内容,这时可以先调用文件夹的EnumObjects方法。方法会创建标准OLE枚举对象并返回其IEnumIDList接口。枚举接口含有4个标准方法:Clone、Next、Reset、Skip。这些方法可用于枚举文件夹内容。
枚举文件夹内容的基本过程是:
- 调用EnumObjects方法获取枚举对象的IEnumIDList接口
- 调用IEnumIDList的Next方法,传入一个未分配的PIDL。Next会为PIDL分配内存,但须由调用方释放分配的内存。Next返回的PID只含有对象的itemID和表示结束的NULL字符。也就是说,返回的是相对于所在文件夹的单层PIDL,不是全限定PIDL。
- 重复步骤2直到Next方法返回S_FALSE,这表示所有内容条目已经枚举完成。
- 调用IEnumIDList::Release释放枚举对象。
注意:要注意当前使用的是相对PIDL还是全限定PIDL。某些函数可以接受两种类型的PIDL,但是有些却只能接受一种类型的。IEnumIDList的另外3个方法可用于重复枚举文件夹内容。这3个方法可以复位枚举过程、跳过一个或者多个对象、制作枚举对象的副本以保存其状态。
确定显示名和其他属性
在枚举了文件夹包含的所有PIDL后,就可以发现它们所代表的对象类型。IShellFolder接口提供了很多有用的方法,这里只讨论两个。IShellFolder接口的其他方法和其他Shell文件夹接口在本系列后面的文章中讨论。
显示名是对象的最重要属性之一。要获取对象的显示名,把PIDL传递给GetDisplayNameOf即可。对象可以位于名字空间中父文件夹以下的任何地方,但PIDL必须是相对于父文件夹的。
GetDisplayNameOf把显示名作为STRRET对象的一部分返回。因为从STRRET结构取出显示名需要一点技巧,所以Shell为你提供了两个函数,StrRetToStr和StrRetToBuf。这两个函数都需要一个STRRET结构体,把显示名作为普通字符串返回。它们的不同在于字符串是如何分配的。
除了显示名外,对象还可以有很多其他属性,比如说,对象是否是文件夹,是否可以被移动。把对象的PIDL传给GetAttributesOf就可以获取其属性。完整的属性列表很长,细节可以参考相关文档。注意传递给GetAttributesOf的PIDL必须是单层的。特别是,GetAttributesOf可以接受Next返回的PIDL。可以传入一个PIDL数组,GetAttributesOf会返回数组中所有对象共有的属性。
如果有对象的全限定路径名或者PIDL,SHGetFileInfo提供了一种获取足够用于多种目的的对象信息的简单方法。SHGetFileInfo返回的信息包括:
- 对象的显示名
- 对象属性
- 对象图标句柄
- 系统图像列表句柄
- 包含对象图标的文件的路径
获取子文件夹的IShellFolder接口指针
调用GetAttributesOf,检查SFGAO_FOLDER标志是否已设置就可以确定文件夹是否含有子文件夹。如果对象是文件夹,就可以绑定到它,这可以提供对象的IShellFolder接口。
要绑定到文件夹,调用父文件夹的BindToObject方法。方法要求传入子文件夹的PIDL,并返回其IShellFolder接口指针。有了这个指针后,就可以枚举文件夹的内容,确定其属性等。
确定对象的父文件夹
如果已有某对象的PIDL,可能需要其父文件夹暴露的某个接口。比如说,如果想用GetDisplayNameOf确定父文件夹的显示名,必须先获取父对象的IShellFolder接口。可以用上一节讨论的技术来达到目的,但有一种更简单的方法,就是使用SHBindToParent方法。这个方法要求传入对象的全限定PIDL,并且返回父文件夹的特定接口指针。SHBindToParent还可以返回对象的单层PIDL以用于GetAttributesOf等方法。
下面的示例控制台应用程序获取系统特别文件夹的PIDL,并且返回其显示名。
#include <shlobj.h>
#include <shlwapi.h>
#include <iostream.h>
int main()
{
LPMALLOC pMalloc = NULL;
IShellFolder *psfParent = NULL;
LPITEMIDLIST pidlSystem = NULL;
LPCITEMIDLIST pidlRelative = NULL;
STRRET strDispName;
TCHAR szDisplayName[MAX_PATH];
HRESULT hr;
hr = SH GetMalloc_r(&pMalloc);
hr = SH GetFolderLocation_r(NULL, CSIDL_SYSTEM, NULL, NULL, &pidlSystem);
hr = SHBindToParent(pidlSystem, IID_IShellFolder, (void **) &psfParent, &pidlRelative);
if(SUCCEEDED(hr))
{
hr = psfParent-> GetDisplayNameOf_r(pidlRelative, SHGDN_NORMAL, &strDispName);
hr = StrRetToBuf(&strDispName, pidlSystem, szDisplayName, sizeof(szDisplayName));
cout << "SHGDN_NORMAL - " <<szDisplayName << '/n';
}
psfParent->Release();
pMalloc->Free(pidlSystem);
pMalloc->Release();
return 0;
}
应用程序首先获取Shell分配器的IMalloc接口指针,并且用SHGetFolderLocation获取系统文件夹的PIDL。然后程序调用SHBindToParent获取系统文件夹父文件夹的IShellFolder接口,以及相对于父文件夹的PIDL。然后使用父文件夹的GetDisplayNameOf方法获取系统文件夹的显示名。
对于GetDisplayNameOf返回的STRRET结构体,可以用StrRetToBuf把显示名转换成普通字符串。在显示了显示名后,接口指针和系统PIDL都被释放。注意不能释放SHBindToParent返回的相对PIDL。
本文转载自:http://blog.sina.com.cn/s/blog_56dee71a0100frhy.html
- 取得文件夹内容信息
- 取得文件夹内容信息
- 取得文件夹内容信息 .
- Getting Information About the Contents of a Folder (取得文件夹内容信息)
- 内容提供者取得联系人信息
- 通过反射取得数组信息并修改数组内容
- 取得文件夹大小
- 取得WebBrowser网页内容
- 取得指定网页内容
- 取得环境变量内容函数
- VC取得环境变量内容
- 取得properties 文件内容
- 文件夹、文件夹内容拷贝
- 取得客户端信息
- 取得客户端信息
- 取得oracle数据库信息
- 取得oracle数据库信息
- Jsp取得浏览器信息
- InternetGetConnectedState
- The IA Software Developer's Manual 之 IA处理器概要
- linux下远程登录到windows界面华工具(3389)rdesktop
- POJ 1159解题报告
- Python 大文件分割http://blog.csdn.net/gashero/category/173657.aspx
- 取得文件夹内容信息
- Eclipse 3.5与Tomcat 404
- 用Google的Native Client提高Web应用程序的性能
- TOMCAT-SSL双向认证-配置实例
- C语言宏的高级应用
- 简单的Web形式文件管理器
- linux下远程登录到windows界面华工具(3389)rdesktop
- 没有什么可以成为未来
- window 7 一个恶心的地方