Как получить расширенные атрибуты файла в Windows в Python / Go / C / Batch? - PullRequest
0 голосов
/ 29 июня 2019

Я много искал и получил некоторые выводы о том, как получить расширенную FA, но они находятся в C #, используя собственные встроенные API языка.Я пытаюсь найти имя автора для файла в Windows, но мое требование в Go / Python / C / Batch (в порядке приоритета).

В python сторонние пакеты (exifread и hachoir_metadata)не работают (не дает никакого результата для примера файла doc / xlsx. Может быть, пакет, который я устанавливаю с помощью pip-install, ошибочен).

Есть ли какой-либо другой способ или любой доступный API MSDN уровня пользователя?

Пожалуйста, дайте мне знать, если есть опыт по этому вопросу.Спасибо.

1 Ответ

2 голосов
/ 29 июня 2019

В C, C ++ или другом языке вы получаете свойства файла с IPropertyStore interface

Например, для файла .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);
}
...