簡體   English   中英

Win32函數判斷文件是否是目錄的后代

[英]Win32 function to tell if a file is descendant of directory

在 C++、Windows 中,我有 2 個文件路徑:

  • 路徑1 :目錄
  • 路徑2 :文件或目錄

如何判斷 Path2 是否是 Path1 的后代? 有沒有外殼函數? 我已經搜索了 Shell API,但找不到任何內容。

注意:我不想自己比較字符串,除非有一種安全的方法可以使路徑具有可比性(處理短名稱、相關項等...)。

我不相信 API 中有一個方便的功能可以為您回答這個問題。 但我也不認為編寫一個健壯的函數來做到這一點並不難。 這是大綱:

  1. 確保 Path1 和 Path2 是絕對路徑。
  2. 檢查 Path1 和 Path2 是否引用同一個文件系統對象(更多內容見下文)。
  3. 如果是這樣,那么您的函數將返回 true。
  4. 如果沒有從 Path2 中去除姓氏,即刪除最后的路徑分隔符(\\ 或 /)及其后的所有內容。
  5. 如果第 4 步未能刪除任何文本(例如,沒有剩余的路徑分隔符),那么您已到達根級別並且您的函數返回 false。
  6. 轉到 2。

現在,如何檢查兩個名稱是否引用同一個文件系統對象。 最安全的方法是為兩個名稱調用GetFileInformationByHandle() ,並比較dwVolumeSerialNumbernFileIndexLownFileIndexHigh 如果全部相等,則這兩個名稱指的是同一個對象。

請注意,僅比較字符串是不夠的,因為單個文件系統對象可以有許多不同的名稱。 例如硬鏈接、符號鏈接、聯結、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.

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