我正在處理一個問題,我需要將用戶輸入的文件名轉換爲唯一的路徑名。比方說,我讓用戶指定一個指向包含一些數據的文件的路徑名稱。然後我可以做Data* pData=Open(PathName)
。現在,如果用戶再次指定相同的路徑名稱,我希望能夠擁有一個已打開文件的表格,並只返回指向相同數據的指針:Data* pData2=GetOpenedData(PathName)
。這很容易通過簡單的std::map<std::string,Data*>
完成,問題是PathName
的不同值可以指向同一個文件。最簡單的情況是Windows不區分大小寫。找到給定輸入的唯一路徑名稱
該代碼是跨平臺的C++,我沒有訪問.NET的東西(但我很樂意#ifdef
Windows和UNIX之間的差異,如果需要)。有誰知道Windows API或POSIX函數可以採用路徑名並返回一個唯一的(系統)字符串,我可以將其鍵入。兩個系統(Windows/POSIX)中的密鑰不一定是相同的,只是在我的代碼的運行實例中是唯一的。
現在,我不擔心鏈接或兩種方式來到同一個文件。比如在Windows中,如果我將\ myserver \ share映射到S:那麼\ myserver \ share \ blah和S:\ blah是同一個文件,但我可以和那些被認爲不同的文件一起生活。但是S:\ blah和S:\ Blah應該是一樣的。如果有辦法讓\ myserver \ share和S:\也是唯一的,那是一種獎勵,我會很開心,但我可以沒有它。 (同樣,如果在UNIX中有多個指向同一文件的鏈接)。
編輯補充:
這不是那麼簡單,只是做在窗戶不區分大小寫的搜索。例如:c://data/mydata.dat
,而這是「無效的」文件名時,Windows會接受它,它會actualy點c:\data\mydata.dat
編輯補充另一件事:
我還想c:\mydirectory\..\blah.dat
同時爲被認可c:\blah.dat