簡體   English   中英

如何判斷一個文件夾是否是特殊Windows文件夾的子文件夾?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM