2011-03-28 50 views
0

的後裔在C++中,Windows中,我有2條文件路徑:Win32函數如果文件是目錄

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

如何判斷Path2是Path1的後代?有沒有Shell功能?我搜索了Shell API並找不到任何。

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

+0

@shellter:'wsh'指Windows腳本宿主,並且與Shell API無關。 – Gabe 2011-03-28 19:17:31

+0

@gabe,我刪除了無用的評論。謝謝澄清! – shellter 2011-03-28 19:31:01

回答

1

您可以使用PathCommonPrefix來比較兩條路徑以獲取通用前綴。然後將通用前綴與Path1(您的目錄)進行比較。

如果兩者相等,那麼Path2應該是後代。

或者您也許能夠不使用out緩衝區而僅僅通過NULL獲取第三個參數,並檢查返回值(即通用前綴字符的計數)是否等於Path1的長度。

PathCommonPrefix的文檔示例看,它看起來不像PathCommonPrefix在'common'前綴中包含尾隨目錄分隔符,因此您必須剝離Path1中的尾部sep或調整結果的比較相應地由於缺乏最後的sep。

+0

謝謝,最初,在閱讀了MSDN中的函數摘要後,我認爲它不起作用,但在閱讀示例之後,我發現它應該起作用。 (它已經驗證,它的工作原理!) – decasteljau 2011-03-28 20:17:40

+0

@decasteljau你需要規範你的路徑才能使它真正起作用。例如,輸入C:\ trick和C:\ trick \ ..會導致C:\ trick的通用前綴不正確。你也意識到你不認爲這會在交叉點,符號鏈接等情況下失敗。也許這對你確定,但我只是想確保你清楚這個限制。 – 2011-03-28 20:32:06

2

我不相信API中有一個方便的函數來爲您解答。但我也不認爲編寫一個強大的功能來完成這一任務是很困難的。以下是大綱:

  1. 確保Path1和Path2是絕對路徑。
  2. 檢查Path1和Path2是否引用相同的文件系統對象(下面的更多內容)。
  3. 如果是這樣,那麼你的函數返回true。
  4. 如果不將最後一個名字從路徑2剝離,即刪除最後的路徑分隔符(\或/)及其後的所有內容。
  5. 如果第4步無法刪除任何文本(例如,沒有路徑分隔符),則您已達到根級別,並且您的函數返回false。
  6. 轉到2.

現在,如何檢查兩個名字指的是同一個文件系統對象。最安全的方法是撥打GetFileInformationByHandle()這兩個名稱,然後比較dwVolumeSerialNumbernFileIndexLownFileIndexHigh。如果全部相同,則這兩個名稱指的是同一個對象。

請注意,比較字符串是不夠的,因爲單個文件系統對象可能有許多不同的名稱。例如硬鏈接,符號鏈接,聯結,UNC與映射的驅動器號等。

+0

這很好,但步驟1有點棘手。 – Gabe 2011-03-28 19:28:47

+0

@Gabe我打電話[PathIsRelative](http://msdn.microsoft.com/en-us/library/bb773660(VS.85).aspx),如果返回true,那麼你需要使它絕對(例如與當前目錄結合使用,或者與您的應用程序制定的路徑相關的內容)。 – 2011-03-28 19:32:55

+1

您還必須刪除路徑中的任何'..'部分,而不必越過根目錄。 – Gabe 2011-03-28 19:39:20

相關問題