【发布时间】:2012-01-08 11:26:54
【问题描述】:
我的代码通过 shell API 枚举收藏夹文件夹(递归)。我使用GetAttributesOf函数来获取我找到的每个对象的属性。
因为我从不向上推进,所以我的期望是我遇到的所有项目都是文件系统对象。这可能不适用于所有子目录,但我非常有信心这对有问题的子目录是正确的。
尽管我有信心,但我确认属性包括SFGAO_FILESYSTEM。如果他们不这样做,那么我会记录一条消息并跳过该项目,因为没有希望能够完成我的工作。我希望我永远不会看到日志记录或必须跳过一个项目,但我还是进行了验证,因为这就是我滚动的方式。
几周后,我优秀的 QA 工程师告诉我,他发现我的程序在某个特定项目上出现了异常行为,大约在发生这种情况的时候,他在日志中看到该项目没有设置文件系统位,并且必须跳过。有问题的项目是,我们有充分的理由相信,一个文件。
自从我最初写这个问题以来,我们已经看到枚举中的几个项目声称不是文件系统项目的情况。麻烦似乎持续了很短的时间,但足够长的时间来搞砸多达六个项目的旗帜。
什么时候文件不是文件系统对象?
【问题讨论】:
-
您是否在枚举可能有子文件夹可能有其他视图的文件夹,例如 Internet 临时文件或 GAC?
-
我没有列举这些文件夹中的任何一个。我将把问题编辑得更具体。
-
对
GetAttributeOf()的调用本身是否失败,使您的标志变量与您初始化的变量保持不变? -
好问题,但在那种情况下,我会在有机会测试
SFGAO_FILESYSTEM之前抛出异常。 -
您是在使用 GetAttributesOf 来查询多个项目,还是只查询一个(如果是后者,为什么不使用 IShellItem::GetAttributes?)。 GetAttributesOf 返回所提供的 shell 项共有的属性,因此单个非文件对象将抑制 SFGAO_FILESYSTEM 标志。最后,您是否记录了更多信息,例如非文件对象的名称?
标签: file winapi windows-shell filesystemobject