我需要能夠將兩個不同的Windows路徑組合成一個路徑(通過將第二個路徑作爲第一個路徑的擴展名)。文件系統中是否存在任何路徑應該沒有關係。例子:當兩個路徑可能都是相對的時,將路徑與Windows API結合起來
C:\abc + def -> C:\abc\def
C:\abc + ..\def -> C:\def
\\server\share + def -> \\server\share\def
..\some\path\abc + ..\def -> ..\some\path\def
..\some\path + ..\..\..\def -> ..\..\def
理想的情況下,還應該解決給定的驅動器上的驅動,相對的「絕對」路徑(即路徑開始與一個反斜槓)爲適當的路徑:
C:\abc + \def -> C:\def
最後,將是很好,如果它處理的第二條路徑是絕對的情況下,通過返回絕對路徑:
C:\abc + D:\def -> D:\def
把它的另一種方式是:
我想要一個函數,將路徑'A'和路徑'B'作爲參數。輸出'C'應該是相同的,如果我先用A調用SetCurrentDirectory
然後用B調用然後調用GetCurrentDirectory
(然而,如果路徑不存在並不重要,並且它不應該改變當前工作目錄,如果A和B都是相對路徑,結果應該是相對路徑;我不特別在意結果路徑是否包含'..'段)。
代碼需要在Windows 7上我已經看過了Windows API中的shell path handling functions工作,但他們似乎並不合適:
爲PathAppend,第一路徑不能是相對:
pszPath中提供的路徑不能以「.. \」或「。\」開頭,因此產生相對路徑字符串爲 。如果存在,則從輸出字符串中除去 。
爲PathCombine,第一路徑不能是相對且不能UNC路徑:
的目錄路徑應在A的形式:,B:,...,Z:
(編輯:在仔細檢查,文件的片斷代碼看起來像它可能真正屬於另一個函數的參數名稱我。 ntioned與方法簽名中給出的參數名稱不同。事實上,如下面第二個答案所示,PathCombine
似乎與UNC路徑一起工作。但是,它具有與PathAppend
相同的問題 - 因爲它會從輸出路徑中刪除前導段..
)。
- PathCchCombine和PathAllocCombine僅在Windows 8及以後可用。
是否有任何我忽略的標準功能,或者是否有任何庫能夠正確處理包括UNC風格路徑在內的所有情況?還是至少有一個簡單的方法來實現一個功能,使用其他已有的功能滿足我的要求?
這聽起來像你可以使用'PathAppend'並編寫保存在第一路徑中的任何超前時段分支機構和事後恢復它們的包裝功能。 –
@JonathanPotter這可能是一種可能性,是的。我仍然希望可能有一個更優雅的解決方案,但它看起來越來越不可能: – davmac
'C:\ abc + \ def - > C:\ def'與C:\ abc + D:\不一致。 def - > D:\ def':在這兩種情況下,第二個路徑都是絕對路徑,但您希望以不同的方式處理它們。在第一個示例中,您可能會得到一條不存在的路徑('C:\ def') ,即使'\ def'也行。 – IInspectable