的後裔在C++中,Windows中,我有2條文件路徑:Win32函數如果文件是目錄
- 路徑1:目錄
- 路徑2:文件或目錄
如何判斷Path2是Path1的後代?有沒有Shell功能?我搜索了Shell API並找不到任何。
注意:我不想自己比較字符串,除非有一種安全的方法來使路徑具有可比性(處理短名稱,相關項目等)。
的後裔在C++中,Windows中,我有2條文件路徑:Win32函數如果文件是目錄
如何判斷Path2是Path1的後代?有沒有Shell功能?我搜索了Shell API並找不到任何。
注意:我不想自己比較字符串,除非有一種安全的方法來使路徑具有可比性(處理短名稱,相關項目等)。
您可以使用PathCommonPrefix來比較兩條路徑以獲取通用前綴。然後將通用前綴與Path1(您的目錄)進行比較。
如果兩者相等,那麼Path2應該是後代。
或者您也許能夠不使用out
緩衝區而僅僅通過NULL
獲取第三個參數,並檢查返回值(即通用前綴字符的計數)是否等於Path1的長度。
從PathCommonPrefix
的文檔示例看,它看起來不像PathCommonPrefix
在'common'前綴中包含尾隨目錄分隔符,因此您必須剝離Path1中的尾部sep或調整結果的比較相應地由於缺乏最後的sep。
謝謝,最初,在閱讀了MSDN中的函數摘要後,我認爲它不起作用,但在閱讀示例之後,我發現它應該起作用。 (它已經驗證,它的工作原理!) – decasteljau 2011-03-28 20:17:40
@decasteljau你需要規範你的路徑才能使它真正起作用。例如,輸入C:\ trick和C:\ trick \ ..會導致C:\ trick的通用前綴不正確。你也意識到你不認爲這會在交叉點,符號鏈接等情況下失敗。也許這對你確定,但我只是想確保你清楚這個限制。 – 2011-03-28 20:32:06
我不相信API中有一個方便的函數來爲您解答。但我也不認爲編寫一個強大的功能來完成這一任務是很困難的。以下是大綱:
現在,如何檢查兩個名字指的是同一個文件系統對象。最安全的方法是撥打GetFileInformationByHandle()
這兩個名稱,然後比較dwVolumeSerialNumber
,nFileIndexLow
,nFileIndexHigh
。如果全部相同,則這兩個名稱指的是同一個對象。
請注意,比較字符串是不夠的,因爲單個文件系統對象可能有許多不同的名稱。例如硬鏈接,符號鏈接,聯結,UNC與映射的驅動器號等。
@shellter:'wsh'指Windows腳本宿主,並且與Shell API無關。 – Gabe 2011-03-28 19:17:31
@gabe,我刪除了無用的評論。謝謝澄清! – shellter 2011-03-28 19:31:01