BOOL GetAllFilesFromFolderPath(IN LPCTSTR lpFolderPath,
OUT vector<wstring> &vctFiles)
{
if ( !PathFileExists(lpFolderPath) )
{
return FALSE;
}
WCHAR szFolderPath[MAX_PATH] = { 0 };
IShellFolder *psfDesktop = NULL;
IShellFolder *psfWorkDir = NULL;
IEnumIDList *penumIDList = NULL;
LPITEMIDLIST pidworkDir = NULL;
wcscpy_s(szFolderPath, MAX_PATH, lpFolderPath);
// +1
HRESULT hr = SHGetDesktopFolder(&psfDesktop);
if (SUCCEEDED(hr))
{
// +2
hr = psfDesktop->ParseDisplayName(NULL, NULL,
szFolderPath, NULL, &pidworkDir, NULL);
}
if (SUCCEEDED(hr))
{
// +3
hr = psfDesktop->BindToObject(pidworkDir,
NULL, IID_PPV_ARGS(&psfWorkDir));
}
if (SUCCEEDED(hr))
{
// +4
hr = psfWorkDir->EnumObjects(NULL,
SHCONTF_NONFOLDERS | SHCONTF_INCLUDEHIDDEN, &penumIDList);
}
if (SUCCEEDED(hr))
{
ULONG celtFetched = 0;
LPITEMIDLIST pidChild = NULL;
while (SUCCEEDED(penumIDList->Next(1, &pidChild, &celtFetched))
&& (1 == celtFetched))
{
// Get the file path from the PIDL of the item.
LPITEMIDLIST pRealIDL = NULL;
HRESULT hr = SHGetRealIDL(psfWorkDir, pidChild, &pRealIDL);
if (SUCCEEDED(hr))
{
STRRET strName;
hr = psfWorkDir->GetDisplayNameOf(pRealIDL,
SHGDN_FORPARSING, &strName);
if (SUCCEEDED(hr))
{
WCHAR szName[MAX_PATH] = { 0 };
hr = StrRetToBuf(&strName, pRealIDL, szName, MAX_PATH);
if (SUCCEEDED(hr))
{
vctFiles.push_back(szName);
}
}
CoTaskMemFree(pRealIDL);
}
CoTaskMemFree(pidChild);
}
}
// -4
SAFE_RELEASE(penumIDList);
// -3
SAFE_RELEASE(psfWorkDir);
// -2
CoTaskMemFree(pidworkDir);
// -1
SAFE_RELEASE(psfDesktop);
return (vctFiles.size() > 0);
}
对上面的程序简单说明一下:
LPITEMIDLIST pRealIDL = NULL;
HRESULT hr = SHGetRealIDL(psfWorkDir, pidChild, &pRealIDL);
if (SUCCEEDED(hr))
{
STRRET strName;
hr = psfWorkDir->GetDisplayNameOf(pRealIDL, SHGDN_FORPARSING, &strName);
if (SUCCEEDED(hr))
{
WCHAR szName[MAX_PATH] = { 0 };
hr = StrRetToBuf(&strName, pRealIDL, szName, MAX_PATH);
if (SUCCEEDED(hr))
{
vctFiles.push_back(szName);
}
}
CoTaskMemFree(pRealIDL);
}