[英]How to tell if a folder is a subfolder of a special Windows folder?
如果我有一個CSIDL (或其較新的替代品KNOWNFOLDERID )用於特殊文件夾(就本例而言,我們假設“ My Documents
文件夾)和DOS文件夾路徑 ,則有什么方法可以說出該路徑是指其中的子文件夾特殊文件夾?
編輯1:在@RemyLebeau的建議之后,我實現了以下方法,但它始終將我的nIsParent
設置為0,或者not a parent
其設置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:
映射到該Home共享的"R:\\Documents"
文件夾。 PathRelativePathTo
在這些路徑上失敗。
編輯3:如果我的My Documents
有一個文件夾Test folder
,則可以使用映射的驅動器R:
來執行此操作:
subst S: "R:\Documents\Test folder"
從技術上講,這也將使文件夾"S:\\Test folder"
成為“ My Documents
"S:\\Test folder"
的父"S:\\Test folder"
,即"\\\\SRVR-A\\Home\\UserName\\Documents\\Test folder"
。
這就是為什么我要尋找僅Shell或單一API解決方案的原因。
Shell中的所有內容都由ITEMIDLIST
結構表示,甚至文件系統路徑也是如此。 檢索ITEMIDLIST
使用特殊的文件夾的SHGetFolderLocation()
或SHGetKnownFolderIDList()
然后檢索ITEMIDLIST
使用DOS路徑SHParseDisplayName()
或ILCreateFromPath()
然后使用ILIsParent()
來檢查特殊文件夾的ITEMIDLIST
是的父DOS路徑的ITEMIDLIST
。
或者,使用SHGetFolderPath()
或SHGetKnownFolderPath()
檢索特殊文件夾的路徑,然后使用PathRelativePathTo
檢查DOS路徑是否可以表示為特殊文件夾路徑的相對子文件夾,而無需使用任何".."
組件。
創建一個獲取完整路徑,特殊文件夾名稱的函數,然后使用特殊文件夾的名稱在完整路徑上調用strstr
,如果它不返回NULL
則它是一個子文件夾。
至於它的API,我不知道類似的東西,但是有可能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.