【发布时间】:2014-06-04 02:30:34
【问题描述】:
如果我有一个特殊文件夹的CSIDL(或其较新的替代品KNOWNFOLDERID)(为了这个例子,我们假设My Documents文件夹)和一个DOS folder path,有什么办法告诉该路径是指特殊文件夹中的子文件夹吗?
编辑1:我在@RemyLebeau 的suggestion 之后实现了以下方法,但它总是将我的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: 映射到该 Home 共享。 PathRelativePathTo 在这些路径上失败。
编辑 3:如果我在 My Documents 中有一个文件夹 Test folder,我可以使用我的映射驱动器 R: 来做到这一点:
subst S: "R:\Documents\Test folder"
从技术上讲,这将使文件夹 "S:\Test folder" 也成为 My Documents 的父级,即 "\\SRVR-A\Home\UserName\Documents\Test folder"。
这就是我寻找纯 Shell 或单一 API 解决方案的原因。
【问题讨论】:
-
如果您使用联结/网络共享/目录链接的全部功能,这将很有趣。即使在一般情况下也无法确定。
-
@Deduplicator:这就是我的意思。这就是为什么我正在寻找一些 Shell API 来为我做这件事(如果有的话。)
-
我认为您最好的选择是为两者获得规范路径,然后手动解决所有连接点/重解析点/软链接/硬链接/网络挂载等。只有解决了这两个问题,才能得到明确的答案。
-
@Deduplicator: 或者你会得到一个 inifinite 的答案。当心循环结和链接。但我支持你的一般观点。虽然对象管理器会解析名称,但这发生在 KM 中。而且 AFAIK 这些 API 是内部的和/或未记录的,所以他/她不走运。
-
@0xC0000022L 我确信内核中也有无限递归保护。如果触发它,你会得到一个错误。
标签: c++ windows winapi windows-shell