我已经使用
IShellItem
,
IShellFolder
,
IStorage
,
IStream
等等。一切都很好。我甚至可以在shell名称空间扩展(例如
.zip
)文件。
但是,当文件正被其他具有独占访问权限的程序使用时,我在提取(常规)文件大小时遇到问题。
阿法克,除了
STATSTG
提供比文件名更多信息的结构。基本上有3种方法可以获得
斯塔茨格
对于一个
伊舍利特姆
:
-
重复使用
IEnumSTATSTG
而不是
IEnumIDList
. 而不是调用
IShellFolder::EnumObjects()
,获取
IStorage公司
用于文件夹和调用
IStorage::EnumElements()
. 你现在得到
斯塔茨格
直接构筑物。
-
获取
IStorage公司
对于
伊舍利特姆
和调用
IStorage::Stat()
.
-
获取
伊斯特里姆
对于
伊舍利特姆
和调用
IStream::Stat()
.
我真的很想使用1,因为它可以提供我所需要的所有信息。但是,我不能让它枚举文件夹内容。我成功地提取了
IStorage公司
文件夹:它是自己的
Stat()
提供正确的文件夹名称。我成功地提取了
伊努姆斯塔茨格
但是第一个电话
Next(1, &item, NULL)
退货
S_FALSE
并终止枚举。
我会退后使用2,因为它仍然不是那么糟糕,而是提取
IStorage公司
对于常规磁盘文件,使用
IShellItem::BindToHandler(0, BHID_Storage, ...)
和
IShellFolder::BindToStorage(child, ...)
。
我最后还是尝试了3,尽管它看起来是错误的,只要文件不被另一个程序以独占访问方式使用,它就会成功。
我搜索了一下,找到了几个使用方法3的代码片段。
问题
有人能解释一下我该怎么拿到文件吗?
斯塔茨格
不使用方法3?
应该接近1工作,还是
IStorage公司
常规文件夹的实现只是不生成列表?应接近2工作或
IStorage公司
只是没有为常规文件实现?
环境
:Windows Vista Ultimate 32位,Visual Studio 2008学习版。使用C++,没有ATL,所有自定义COM包装器(内部的,可以适当地修改,假设SunWess是错误的)。