检查给定路径是否为特殊文件夹路径? [英] Check if a given path is a special folder path?

查看:141
本文介绍了检查给定路径是否为特殊文件夹路径?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在Windows上,可以使用SHGetKnownFolderPathSHGetSpecialFolder获取任何特殊的文件夹路径(如果我没记错的话,可以找到最后一个).但是,我想反过来,我有一个路径,想知道它属于哪个特殊文件夹(如果有).我更喜欢这种方法,因为要查明给定路径是否在特定的特殊文件夹中,我必须为所有用户枚举所有特殊的文件夹,这有点丑陋,但是如果没有其他方法,那么天空是极限:)

On Windows, one can get any special folder path using SHGetKnownFolderPath or SHGetSpecialFolder (If I remember correctly this last one). However, I want the reverse, I have a path and want to know which special folder it belongs to, if any. I prefer this approach, because to find out if a given path's is in a particular special folder or not, I'll have to enumerate all special folders for all users which is a bit of ugly, but if there's no other way, the sky is the limit :)

我搜索了它,但找不到有用的东西.那么WinApi是否具有执行此功能的功能?

I searched it but couldn't find anything useful. So does WinApi has a function to do just that?

谢谢.

推荐答案

您可以使用

You can use IKnownFolderManager::FindFolderFromPath

自Vista开始提供.

Available since Vista.

PS:检出 CComPtr<> 类简化与COM的连接.

这是我刚刚制作的一个示例,展示了如何使用它:

Here is a sample i just made up, showing how to use it:

#include <atlsafe.h>
#include <Shobjidl.h>
#include <comdef.h>

void PrintKnownFolder( const CComPtr<IKnownFolder>& folder )
{
    KNOWNFOLDER_DEFINITION def;
    HRESULT hr = folder->GetFolderDefinition( &def );
    if( SUCCEEDED(hr) ) {
        std::wcout << L"Result: " << def.pszName << std::endl;
        FreeKnownFolderDefinitionFields( &def );
    } else {
        _com_error err(hr);
        std::wcout << L"Error while querying GetFolderDefinition: " << err.ErrorMessage() << std::endl;
    }
}


class CCoInitialize
{
public:
    CCoInitialize() : m_hr(CoInitialize(NULL)) { }
    ~CCoInitialize() { if (SUCCEEDED(m_hr)) CoUninitialize(); }
    operator HRESULT() const { return m_hr; }
private:
    HRESULT m_hr;
};


bool test()
{
    CCoInitialize co;
    CComPtr<IKnownFolderManager> knownFolderManager;
    HRESULT hr = knownFolderManager.CoCreateInstance( CLSID_KnownFolderManager );
    if( !SUCCEEDED(hr) ) {
        _com_error err(hr);
        std::wcout << L"Error while creating KnownFolderManager: " << err.ErrorMessage() << std::endl;
        return false;
    }

    CComPtr<IKnownFolder> folder;
    hr = knownFolderManager->FindFolderFromPath( L"C:\\Users\\All Users\\Microsoft", FFFP_NEARESTPARENTMATCH, &folder );
    if( SUCCEEDED(hr) ) {
        PrintKnownFolder(folder);
    } else {
        _com_error err(hr);
        std::wcout << L"Error while querying KnownFolderManager for nearest match: " << err.ErrorMessage() << std::endl;
    }

    // dispose it.
    folder.Attach( NULL );

    hr = knownFolderManager->FindFolderFromPath( L"C:\\Users\\All Users\\Microsoft", FFFP_EXACTMATCH, &folder );
    if( SUCCEEDED(hr) ) {
        PrintKnownFolder(folder);
    } else {
        _com_error err(hr);
        std::wcout << L"Error while querying KnownFolderManager for exact match: " << err.ErrorMessage() << std::endl;
    }

    return true;
}

The Old New Thing借来的CCoInitialize

CCoInitialize borrowed from The Old New Thing

这篇关于检查给定路径是否为特殊文件夹路径?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆