如何在 Python/Go/C/Batch 中获取 Windows 中的扩展文件属性?
How to get extended file-attributes in Windows in Python/Go/C/Batch?
我进行了很多搜索并找到了一些关于如何获得扩展 FA 的发现,但它们是在 C# 中使用该语言自己的内置 APIs。我试图在 Windows 中查找文件的作者姓名,但我的要求是 Go/Python/C/Batch(优先顺序)。
在 python 中,第三方包(exifread 和 hachoir_metadata)不工作(没有给出示例 doc/xlsx 文件的任何结果。可能是我通过安装的包pip-install 是错误的)。
是否有任何其他方式或任何用户级 MSDN API 可用?
如果有这方面的经验,请告诉我。谢谢
在 C、C++ 或其他语言中,您可以使用 IPropertyStore 接口
获取文件属性
例如,对于 .jpg 文件(在 Windows 10,VS 2015 上测试)=>
我得到 作者 :
System.Author(作者)=测试作者
PIDLIST_ABSOLUTE pidl = ILCreateFromPath(L"E:\icon_rose.jpg");
if (pidl != NULL)
{
IPropertyStore *pps;
HRESULT hr = SHGetPropertyStoreFromIDList(pidl, GPS_DEFAULT, IID_PPV_ARGS(&pps));
if (SUCCEEDED(hr))
{
DWORD dwCount;
hr = pps->GetCount(&dwCount);
PROPERTYKEY propKey;
for (DWORD i = 0; i < dwCount; ++i)
{
hr = pps->GetAt(i, &propKey);
if (SUCCEEDED(hr))
{
PWSTR pszCanonicalName = NULL;
hr = PSGetNameFromPropertyKey(propKey, &pszCanonicalName);
PWSTR pszDescriptionName = NULL;
IPropertyDescription *ppd;
hr = PSGetPropertyDescription(propKey, IID_PPV_ARGS(&ppd));
if (SUCCEEDED(hr))
{
hr = ppd->GetDisplayName(&pszDescriptionName);
ppd->Release();
}
PROPVARIANT propvarValue = { 0 };
HRESULT hr = pps->GetValue(propKey, &propvarValue);
if (SUCCEEDED(hr))
{
PWSTR pszDisplayValue = NULL;
hr = PSFormatForDisplayAlloc(propKey, propvarValue, PDFF_DEFAULT, &pszDisplayValue);
if (SUCCEEDED(hr))
{
WCHAR wsBuffer[255];
wsprintf(wsBuffer, L"%s(%s) = %s\n", pszCanonicalName, (pszDescriptionName==NULL?L"Unknown":pszDescriptionName), pszDisplayValue);
OutputDebugString(wsBuffer);
CoTaskMemFree(pszDisplayValue);
}
PropVariantClear(&propvarValue);
}
if (pszCanonicalName != NULL)
CoTaskMemFree(pszCanonicalName);
if (pszDescriptionName != NULL)
CoTaskMemFree(pszDescriptionName);;
}
}
pps->Release();
}
ILFree(pidl);
}
我进行了很多搜索并找到了一些关于如何获得扩展 FA 的发现,但它们是在 C# 中使用该语言自己的内置 APIs。我试图在 Windows 中查找文件的作者姓名,但我的要求是 Go/Python/C/Batch(优先顺序)。
在 python 中,第三方包(exifread 和 hachoir_metadata)不工作(没有给出示例 doc/xlsx 文件的任何结果。可能是我通过安装的包pip-install 是错误的)。
是否有任何其他方式或任何用户级 MSDN API 可用?
如果有这方面的经验,请告诉我。谢谢
在 C、C++ 或其他语言中,您可以使用 IPropertyStore 接口
获取文件属性例如,对于 .jpg 文件(在 Windows 10,VS 2015 上测试)=>
我得到 作者 : System.Author(作者)=测试作者
PIDLIST_ABSOLUTE pidl = ILCreateFromPath(L"E:\icon_rose.jpg");
if (pidl != NULL)
{
IPropertyStore *pps;
HRESULT hr = SHGetPropertyStoreFromIDList(pidl, GPS_DEFAULT, IID_PPV_ARGS(&pps));
if (SUCCEEDED(hr))
{
DWORD dwCount;
hr = pps->GetCount(&dwCount);
PROPERTYKEY propKey;
for (DWORD i = 0; i < dwCount; ++i)
{
hr = pps->GetAt(i, &propKey);
if (SUCCEEDED(hr))
{
PWSTR pszCanonicalName = NULL;
hr = PSGetNameFromPropertyKey(propKey, &pszCanonicalName);
PWSTR pszDescriptionName = NULL;
IPropertyDescription *ppd;
hr = PSGetPropertyDescription(propKey, IID_PPV_ARGS(&ppd));
if (SUCCEEDED(hr))
{
hr = ppd->GetDisplayName(&pszDescriptionName);
ppd->Release();
}
PROPVARIANT propvarValue = { 0 };
HRESULT hr = pps->GetValue(propKey, &propvarValue);
if (SUCCEEDED(hr))
{
PWSTR pszDisplayValue = NULL;
hr = PSFormatForDisplayAlloc(propKey, propvarValue, PDFF_DEFAULT, &pszDisplayValue);
if (SUCCEEDED(hr))
{
WCHAR wsBuffer[255];
wsprintf(wsBuffer, L"%s(%s) = %s\n", pszCanonicalName, (pszDescriptionName==NULL?L"Unknown":pszDescriptionName), pszDisplayValue);
OutputDebugString(wsBuffer);
CoTaskMemFree(pszDisplayValue);
}
PropVariantClear(&propvarValue);
}
if (pszCanonicalName != NULL)
CoTaskMemFree(pszCanonicalName);
if (pszDescriptionName != NULL)
CoTaskMemFree(pszDescriptionName);;
}
}
pps->Release();
}
ILFree(pidl);
}