我已经使用
然而,当其他程序以独占访问方式使用文件时,我无法提取(常规)文件大小。
据我所知,除了文件名称外,没有什么比
1. 使用
我真的很想使用第一种方法,因为它会给我所有需要的信息。但是,我无法枚举文件夹内容。我成功地提取了文件夹的
如果无法使用方法1,我将使用方法2,虽然这仍然不太好,但是对于常规磁盘文件提取
最后我尝试了方法3,虽然它似乎很奇怪,但只要文件没有被其他程序以独占访问方式使用,它就可以成功。
我在网上搜寻了一些代码片段,发现了使用方法3的几个例子。
问题:有人能解释一下我应该如何在不使用方法3的情况下获取文件的
方法1是否有效?或者常规文件的
IShellItem
、IShellFolder
、IStorage
、IStream
等实现了Windows Shell的目录遍历算法。一切都很好。我甚至可以遍历Shell命名空间扩展(例如.zip
)文件。然而,当其他程序以独占访问方式使用文件时,我无法提取(常规)文件大小。
据我所知,除了文件名称外,没有什么比
STATSTG
结构体提供更多信息了。获取IShellItem
的STATSTG
有三种方法:1. 使用
IEnumSTATSTG
进行迭代,而不是使用IEnumIDList
。获取文件夹的IStorage
并调用IStorage::EnumElements()
,而不是调用IShellFolder::EnumObjects()
。这样你就可以直接获得STATSTG
结构体了。
2. 获取IShellItem
的IStorage
并调用IStorage::Stat()
。
3. 获取IShellItem
的IStream
并调用IStream::Stat()
。我真的很想使用第一种方法,因为它会给我所有需要的信息。但是,我无法枚举文件夹内容。我成功地提取了文件夹的
IStorage
:它自己的Stat()
给出了正确的文件夹名称。我成功地提取了IEnumSTATSTG
,但第一次调用Next(1, &item, NULL)
返回S_FALSE
并终止枚举。如果无法使用方法1,我将使用方法2,虽然这仍然不太好,但是对于常规磁盘文件提取
IStorage
会产生错误,无论是使用IShellItem::BindToHandler(0, BHID_Storage, ...)
还是IShellFolder::BindToStorage(child, ...)
都不行。最后我尝试了方法3,虽然它似乎很奇怪,但只要文件没有被其他程序以独占访问方式使用,它就可以成功。
我在网上搜寻了一些代码片段,发现了使用方法3的几个例子。
问题:有人能解释一下我应该如何在不使用方法3的情况下获取文件的
STATSTG
吗?方法1是否有效?或者常规文件的
IStorage
实现是否不会生成列表?方法2是否有效,或者常规文件的IStorage
实现是否未实现?
环境: Windows Vista Ultimate 32位, Visual Studio 2008 Express. 使用C++,没有ATL,所有自定义COM包装器(内部开发,可能需要适当修改,假设有问题)。