如果我有一个特殊文件夹的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解决方案的原因。
答案 0 :(得分:1)
Shell中的所有内容都由ITEMIDLIST
结构表示,甚至是文件系统路径。使用SHGetFolderLocation()
或SHGetKnownFolderIDList()
检索特殊文件夹的ITEMIDLIST
,然后使用SHParseDisplayName()
或ILCreateFromPath()
检索DOS路径的ITEMIDLIST
,然后使用ILIsParent()
检查特殊文件夹的ITEMIDLIST
是否是DOS路径ITEMIDLIST
的父级。
或者,使用SHGetFolderPath()
或SHGetKnownFolderPath()
检索特殊文件夹的路径,然后使用PathRelativePathTo
检查DOS路径是否可以表示为特殊的相对子文件夹文件夹的路径,不使用任何".."
组件。
答案 1 :(得分:-2)
创建一个获取完整路径的函数,特殊文件夹的名称,然后只需调用
strstr
在具有特殊文件夹名称的完整路径上,如果它不返回NULL
,则它是一个子文件夹。
对于它的API,我不知道类似的东西,但它可能是。