如何判断文件夹是否是特殊Windows文件夹的子文件夹?

时间:2014-06-04 02:30:34

标签: c++ windows winapi windows-shell

如果我有一个特殊文件夹的CSIDL(或更新的替代KNOWNFOLDERID)(为了这个例子,我们假设My Documents文件夹)和{{3} ,有没有办法告诉路径引用特殊文件夹中的子文件夹?

编辑1:我在@ RemyLebeau的DOS folder path之后实施了以下方法,但它始终将我的nIsParent设置为0或not a parent。我在那里错过了什么?

int nCSIDL = CSIDL_PERSONAL;
LPCTSTR pDosPath = L"C:\\Users\\UserName\\Documents\\Subfolder1\\File.txt";

int nIsParent = -1; //-1=error, 0=no, 1=yes

LPITEMIDLIST pidlDocuments = NULL;
if(SUCCEEDED(SHGetFolderLocation(NULL, nCSIDL, NULL, 0, &pidlDocuments)))
{
    LPITEMIDLIST pidl = ILCreateFromPath(pDosPath);
    if(pidl)
    {
        nIsParent = ILIsParent(pidlDocuments, pidl, FALSE) ? 1 : 0;

        ILFree(pidl);
    }

    ILFree(pidlDocuments);
}

编辑2:关于他在DOS路径上使用SHGetPathFromIDList然后PathRelativePathTo的第二个建议,它将不适用于以下内容:我的文档在我的计算机被重定向到"\\SRVR-A\Home\UserName\Documents",这也是"R:\Documents"文件夹,其中驱动器R:映射到该主页共享。 PathRelativePathTo在这些路径上失败。

编辑3:如果Test folder中有My Documents文件夹,我可以使用我的映射驱动器R:执行此操作:

subst S: "R:\Documents\Test folder"

从技术上讲,文件夹"S:\Test folder"也会成为My Documents的父级,"\\SRVR-A\Home\UserName\Documents\Test folder"

这就是我寻找仅限Shell或单一API解决方案的原因。

2 个答案:

答案 0 :(得分:1)

Shell中的所有内容都由ITEMIDLIST结构表示,甚至是文件系统路径。使用SHGetFolderLocation()SHGetKnownFolderIDList()检索特殊文件夹的ITEMIDLIST,然后使用SHParseDisplayName()ILCreateFromPath()检索DOS路径的ITEMIDLIST,然后使用ILIsParent()检查特殊文件夹的ITEMIDLIST是否是DOS路径ITEMIDLIST的父级。

或者,使用SHGetFolderPath()SHGetKnownFolderPath()检索特殊文件夹的路径,然后使用PathRelativePathTo检查DOS路径是否可以表示为特殊的相对子文件夹文件夹的路径,不使用任何".."组件。

答案 1 :(得分:-2)

创建一个获取完整路径的函数,特殊文件夹的名称,然后只需调用 strstr在具有特殊文件夹名称的完整路径上,如果它不返回NULL,则它是一个子文件夹。

对于它的API,我不知道类似的东西,但它可能是。