在Windows上,可以使用SHGetKnownFolderPath
或SHGetSpecialFolder
获得任何特殊的文件夹path(如果我没有记错的话,最后一个)。 不过,我想反过来,我有一个path,并想知道它属于哪个特殊的文件夹,如果有的话。 我更喜欢这种方法,因为要找出一个给定的path是否在一个特定的特殊文件夹中,我将不得不枚举所有用户的所有特殊文件夹,这是有点丑陋,但如果没有其他方式,天空是极限:)
我搜查了它,但找不到任何有用的东西。 那么WinApi有这个function吗?
谢谢。
您可以使用IKnownFolderManager::FindFolderFromPath
自Vista以来可用。
PS:检查CComPtr<>
类与COM更简单的接口。
下面是我刚制作的一个示例,展示了如何使用它:
#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; }
CCoInitialize借用The Old New Thing