2012-06-14 58 views
13

如何從GNU/Linux上的C/C++中的給定相對路徑中確定文件或目錄的絕對路徑?我知道realpath(),但它不適用於不存在的文件。如何獲得文件或目錄的絕對路徑,即* not * exists?

假設用戶輸入../non-existant-directory/file.txt,程序工作目錄爲/home/user/
我需要的是一個返回/home/non-existant-directory/file.txt的函數。

我需要此功能來檢查給定的路徑是否在某個子目錄中。

+0

我不認爲像這樣的東西存在內置。你將不得不自己寫代碼。 –

回答

10

嘗試realpath。如果失敗,則開始從最後一個路徑組件中刪除路徑組件,然後重試realpath,直到成功爲止。然後將刪除的組件添加回成功的realpath調用的結果。

如果您確定包含的目錄存在,並且您只想在其中創建文件,則只需刪除至多一個組件。

另一種方法是將創建爲文件先,然後調用realpath

+0

第一個解決方案工作,謝謝! –

0

你可以得到當前目錄和應用以下邏輯:如果路徑以「/」,根

取代當前目錄的相對路徑上提到的每個目錄開始

執行以下:

  • 如果您在相對路徑的最後一部分,它附加到當前目錄的路徑,並停止:當前目錄的路徑是絕對路徑。

  • 否則:檢查當前目錄下是否存在這樣的目錄。

  • 如果它確實存在,但不是目錄,信號錯誤(除非路徑中的最後一項)

  • 如果它確實存在,它是一個目錄,看它是否是一個符號鏈接(在支持此功能的操作系統上)。如果是,則將當前目錄替換爲符號鏈接的指向目錄。

  • 如果它確實存在,而且它是一個目錄,而不是一個符號鏈接,該目錄到當前目錄的路徑追加(即選中的子目錄替換當前目錄)

  • 如果沒有存在時,將相對路徑的其餘部分附加到當前目錄的路徑並停止。

+2

這基本上是自己重新實現'realpath',並且比你需要做更多的工作。 –

相關問題