如何检索 IShellItem 的文件大小?

How to retrieve an IShellItem's file size?

给定一个 IShellItem*,我怎样才能知道它的大小?

环顾四周,我发现解决方案可以是:

  1. 绑定 IShellItem2 到给定的 IShellItem
  2. 检索 IShellItem 属性 商店
  3. this function(如页面中的示例所示),找到文件的大小

我不完全理解 Win32 API,所以也许我理解错了,但如果我是对的,我发现很难通过第一步 - 我如何绑定这两个?

您不需要使用 IPropertyStore if you have an IShellItem2 reference, you can directly use IShellItem2::GetUInt64 。这是一些示例代码:

CoInitialize(NULL);

...

IShellItem2* item;
if (SUCCEEDED(SHCreateItemFromParsingName(L"c:\myPath\myFile.ext", NULL, IID_PPV_ARGS(&item))))
{
  ULONGLONG size;
  if (SUCCEEDED(item->GetUInt64(PKEY_Size, &size))) // include propkey.h
  {
    ... use size ...
  }
  item->Release();
}

...

CoUninitialize();

如果你已经有一个IShellItem引用(一般你想直接得到一个IShellItem2)并且想要一个IShellItem2,你可以这样做:

IShellItem2* item2;
if (SUCCEEDED(item->QueryInterface(&item2)))
{
    ... use IShellItem2 ...
}

另一种方法,w/o 使用 IShellItem2,是这样的:

IShellItem* item;
if (SUCCEEDED(SHCreateItemFromParsingName(L"c:\myPath\myFile.ext", NULL, IID_PPV_ARGS(&item))))
{
  IPropertyStore* ps;
  if (SUCCEEDED(item->BindToHandler(NULL, BHID_PropertyStore, IID_PPV_ARGS(&ps))))
  {
    PROPVARIANT pv;
    PropVariantInit(&pv);
    if (SUCCEEDED(ps->GetValue(PKEY_Size, &pv)))  // include propkey.h
    {
      ULONGLONG size;
      if (SUCCEEDED(PropVariantToUInt64(pv, &size))) // include propvarutil.h
      {
        ... use size ...
      }
      PropVariantClear(&pv);
    }
    ps->Release();
  }
  item->Release();
}