[英]Win32 function to tell if a file is descendant of directory
在 C++、Windows 中,我有 2 個文件路徑:
如何判斷 Path2 是否是 Path1 的后代? 有沒有外殼函數? 我已經搜索了 Shell API,但找不到任何內容。
注意:我不想自己比較字符串,除非有一種安全的方法可以使路徑具有可比性(處理短名稱、相關項等...)。
我不相信 API 中有一個方便的功能可以為您回答這個問題。 但我也不認為編寫一個健壯的函數來做到這一點並不難。 這是大綱:
現在,如何檢查兩個名稱是否引用同一個文件系統對象。 最安全的方法是為兩個名稱調用GetFileInformationByHandle()
,並比較dwVolumeSerialNumber
、 nFileIndexLow
、 nFileIndexHigh
。 如果全部相等,則這兩個名稱指的是同一個對象。
請注意,僅比較字符串是不夠的,因為單個文件系統對象可以有許多不同的名稱。 例如硬鏈接、符號鏈接、聯結、UNC 與映射的驅動器號等。
您可以使用PathCommonPrefix來比較兩個路徑以獲得一個公共前綴。 然后將公共前綴與 Path1(您的目錄)進行比較。
如果兩者相等,則 Path2 應該是后代。
或者,您也許可以不使用out
緩沖區而逃脫,只需為第三個參數傳遞NULL
並檢查返回值(即公共前綴字符的計數)是否等於 Path1 的長度。
從PathCommonPrefix
的文檔示例中,它看起來不像PathCommonPrefix
在“common”前綴中包含尾隨目錄分隔符,因此您必須去除 Path1 中的尾隨 sep 或相應地調整結果的比較,因為缺少尾隨九月
這是我提出的一個解決方案,到目前為止它似乎有效(在我有限的測試中)。 它測試文件是否是直系后代,並獲取相對路徑。 它基於PathRelativePathTo
。
BOOL PathDirectRelativePathTo(LPWSTR pszPath, LPCWSTR pszFrom, DWORD dwAttrFrom, LPCWSTR pszTo, DWORD dwAttrTo)
{
return PathRelativePathTo(pszPath, pszFrom, dwAttrFrom, pszTo, dwAttrTo) && pszPath[1] == L'\\';
}
前提是當文件是直系后代時, PathRelativePathTo
獲取的相對路徑以.\\
開頭。 當它不是直系后代時,相對路徑以..
開頭。 所以這個函數測試相對路徑的第二個字符是否是\\
。 但同樣,我只是想出了這個,所以也許某處潛伏着一些問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.