如何检索 IShellItem 的文件大小?
How to retrieve an IShellItem's file size?
给定一个 IShellItem*
,我怎样才能知道它的大小?
环顾四周,我发现解决方案可以是:
- 绑定
IShellItem2
到给定的 IShellItem
- 检索
IShellItem
属性 商店
- 和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();
}
给定一个 IShellItem*
,我怎样才能知道它的大小?
环顾四周,我发现解决方案可以是:
- 绑定
IShellItem2
到给定的IShellItem
- 检索
IShellItem
属性 商店 - 和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();
}