2010-10-14 38 views
1

我正在處理一個問題,我需要將用戶輸入的文件名轉換爲唯一的路徑名。比方說,我讓用戶指定一個指向包含一些數據的文件的路徑名稱。然後我可以做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

回答

0

對於Windows,PathCanonicalize()是你的朋友。 Windows中的shell路徑處理包有一些額外的例程可以幫助你。

不幸的是,我不確定這個包的Unix等價物是什麼。

0

對於Windows,您可以存儲使所有小寫(或大寫)資源的完整路徑。

我不使用* nix所以不能告訴。但我相信在* nix系統的情況下很重要(\home\a\home\A是不同的)。如果是這種情況,那麼你可以省略轉換大小寫* nix的用戶輸入。

0

您可以選擇使用第三個模板參數實例化std::map,該參數是比較函數/函數(請參閱,例如http://www.cplusplus.com/reference/stl/map/)。您可以提供不區分大小寫的字符串比較函數。

我相信Scott Meyers在Effective STL中提供了這樣一個函數的一個很好的例子;我回家後可以檢查一下。

相關問題