代码之家  ›  专栏  ›  技术社区  ›  André Caron

通过'ishelitem'获取文件大小`

  •  7
  • André Caron  · 技术社区  · 14 年前

    我已经使用 IShellItem , IShellFolder , IStorage , IStream 等等。一切都很好。我甚至可以在shell名称空间扩展(例如 .zip )文件。

    但是,当文件正被其他具有独占访问权限的程序使用时,我在提取(常规)文件大小时遇到问题。

    阿法克,除了 STATSTG 提供比文件名更多信息的结构。基本上有3种方法可以获得 斯塔茨格 对于一个 伊舍利特姆 :

    1. 重复使用 IEnumSTATSTG 而不是 IEnumIDList . 而不是调用 IShellFolder::EnumObjects() ,获取 IStorage公司 用于文件夹和调用 IStorage::EnumElements() . 你现在得到 斯塔茨格 直接构筑物。
    2. 获取 IStorage公司 对于 伊舍利特姆 和调用 IStorage::Stat() .
    3. 获取 伊斯特里姆 对于 伊舍利特姆 和调用 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是错误的)。

    2 回复  |  直到 14 年前
        1
  •  1
  •   Roger Lipscombe    14 年前

    您是否尝试获取ishellitem2接口,然后查询pkey_size属性的值?

        2
  •  1
  •   Ian Boyd    8 年前

    即使有了公认的答案,也需要做一些事情。

    你首先需要的是 Windows Properties 参考。从那里你必须知道你想进入 System.Size . 从那里你可以得到两个重要的信息:

    系统大小

    系统提供了项的文件系统大小(以字节为单位)。

    雪尔普基 =pkey_尺寸
    类型信息
    类型 =uint64

    知道这是一个 UInt64 你就可以得到 IShellItem2 接口,以便使用许多属性获取方法之一:

    //Get the IShellItem2 interface out of the IShellItem object
    IShellItem2 si2 = shellItem as IShellItem2;
    
    //Get the file fize (in bytes)
    UInt64 fileSize;
    si2.GetUInt64(PKEY_Size, ref fileSize);