Windows获取所有视频文件的扩展名

    有时候,我们想得到当前电脑上面视频类型文件的扩展名,(事实上,不光是视频类型的,还有音乐类型,文档类型的文件的扩展名),我们要怎么实现呢?其实这些信息都是存放在注册表中,包括每种类型的文件的属性选项都是存放在注册表中。下面讲一下如何得到视频类型的文件扩展名(同理也可以得到其实类型的)。

    注册表路径:

    HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\KindMap

    如下图所示:

    


    可以从上面图看到,一个扩展名对应一个类型,如.3gp对应的数据是video,就说明.3gp是一个视频类型的文件。

    我们要做的就遍历这些值,过滤出我们想要的。 下面代码给了了实现,第一个参数是vector<wstring>&,作输入输出用的,第二个参数是type,表示你想得到什么类型的文件扩展名。 

    实现代码如下:

void GetMediaExtension(vector<wstring>& vctExtensions, LPCWSTR lpVideoType)
{
    HKEY hKey = NULL;
    DWORD dwType  = REG_SZ;
    LONG retv = -1;
    const WCHAR *pVideoType = (NULL == lpVideoType) ? KIND_VIDEO : lpVideoType;
    const WCHAR *pRegPath = 
        L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\KindMap";

    retv = RegOpenKeyEx(HKEY_LOCAL_MACHINE, pRegPath, 0, KEY_READ, &hKey);
    if (ERROR_SUCCESS == retv)
    {
        TCHAR    achClass[MAX_PATH] = L"";
        DWORD    cchClassName = MAX_PATH;
        DWORD    cSubKeys = 0;
        DWORD    cbMaxSubKey = 0;
        DWORD    cchMaxClass = 0;
        DWORD    kNumber = 0;
        DWORD    cchMaxValue = 0;
        DWORD    cbMaxValueData = 0;
        DWORD    cbSecurityDescriptor = 0;
        FILETIME ftLastWriteTime;

        retv = RegQueryInfoKey(
            hKey,
            achClass,
            &cchClassName,
            NULL,
            &cSubKeys,
            &cbMaxSubKey,
            &cchMaxClass,
            &kNumber,
            &cchMaxValue,
            &cbMaxValueData,
            &cbSecurityDescriptor,
            &ftLastWriteTime);

        if (ERROR_SUCCESS == retv)
        {
            TCHAR szValueName[MAX_PATH] = { 0 };
            TCHAR szValueData[MAX_PATH] = { 0 };
            DWORD dwcchValueName = MAX_PATH;
            DWORD dwcchValueData = MAX_PATH;

            for (int i = 0; i < (int)kNumber; ++i)
            {
                dwcchValueName = MAX_PATH;
                ZeroMemory(szValueName, sizeof(TCHAR) * MAX_PATH);

                retv = RegEnumValue(
                    hKey,
                    i,
                    szValueName,
                    &dwcchValueName,
                    NULL,
                    NULL,
                    NULL,
                    NULL);

                if (ERROR_SUCCESS == retv)
                {
                    dwType = REG_SZ;
                    dwcchValueData = MAX_PATH;
                    ZeroMemory(szValueData, sizeof(TCHAR) * MAX_PATH);

                    retv = RegQueryValueEx(
                        hKey,
                        szValueName,
                        NULL,
                        &dwType,
                        (PBYTE)szValueData,
                        &dwcchValueData);

                    if (ERROR_SUCCESS == retv)
                    {
                        if (0 == _wcsicmp(szValueData, pVideoType))
                        {
                            vctExtensions.push_back(wstring(szValueName));
                        }
                    }
                }
            }
        }
    }

    if (NULL != hKey)
    {
        RegCloseKey(hKey);
    }
}

用法如下:

vector<wstring> vctExts;

GetMediaExtension(vctExts, _T("video")); 或者

GetMediaExtension(vctExts, KIND_VIDEO);


其中KIND_VIDEO是系统定义的,在propkey.h文件中,系统还定义了如下的kind:

// Possible discrete values for PKEY_Kind are:
#define KIND_CALENDAR                       L"calendar"
#define KIND_COMMUNICATION                  L"communication"
#define KIND_CONTACT                        L"contact"
#define KIND_DOCUMENT                       L"document"
#define KIND_EMAIL                          L"email"
#define KIND_FEED                           L"feed"
#define KIND_FOLDER                         L"folder"
#define KIND_GAME                           L"game"
#define KIND_INSTANTMESSAGE                 L"instantmessage"
#define KIND_JOURNAL                        L"journal"
#define KIND_LINK                           L"link"
#define KIND_MOVIE                          L"movie"
#define KIND_MUSIC                          L"music"
#define KIND_NOTE                           L"note"
#define KIND_PICTURE                        L"picture"
#define KIND_PROGRAM                        L"program"
#define KIND_RECORDEDTV                     L"recordedtv"
#define KIND_SEARCHFOLDER                   L"searchfolder"
#define KIND_TASK                           L"task"
#define KIND_VIDEO                          L"video"
#define KIND_WEBHISTORY                     L"webhistory"



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值