2016-06-21 80 views
0

我有一個程序,輸入需要的文件列表,這是保存在std::vector刪除重複的文件名

std::vector<std::string> fileNames; 

用戶完全可以自由進入任何文件名(他們採取從argv),並且如果其進入是指同一文件的程序應該忽略重複項的文件名。 的問題是,用戶甚至可以使具有矢量是這樣的:

{ 
"myfile1.txt", 
"/path/to/myfile1.txt", 
"/path//to/myfile1.txt" 
} 

考慮我從/path/to調用程序,這三個文件的名字指的是同一個文件,但它們是不同的字符串。

我必須打開它們fopen()不是std::ifstream)。

,並檢查他們所有的程序fopen() S中所有文件開始的過程之前,所以它不是一個問題。

是否有刪除重複的文件名稱的有效途徑?

+2

你爲什麼不給我們一套? –

+2

第一步是將它們歸一化爲相同的形式:完整路徑,更換''//用'/'然後它的一個簡單的任務 – vu1p3n0x

+1

[可能有助於](http://www.boost.org/doc/libs /1_48_0/libs/filesystem/v3/doc/reference.html#canonical)。請注意,該路徑必須存在才能起作用,並且「if(exists){...}」不夠好,因爲它在您使用它時可能不存在。 – chris

回答

2

您可以使用std::set,而不是一個向量,以確保相同的字符串只列出一次。

或者,也可以std::sort(或std::stable_sort)的向量,然後使用與std::uniquestd::erase組合以刪除重複。

至於那指代相同的文件不相同的字符串;在Linux上,您可以使用realpath(3)在將所有路徑添加到向量(或集合)之前對其進行規範化。我不知道Windows上的等效函數,但我確定有一個。如果你還需要在Windows上工作,也許可以嘗試通過msdn.com搜索。

+0

該集會保持用戶給定的文件的順序嗎? – NoImaginationGuy

+0

@ osnapitzkindle編號該套件不會保留該訂單。 –

+0

是不是有一個有序的集或類似許多其他語言的東西? – NoImaginationGuy

0

對於便攜式解決方案,您可以使用boost::filesystem

boost::equivalent()

返回:true,如果SF1 == SF2和p1和p2解析爲同一個文件系統 實體,否則爲假。

這種方式,你將不得不每個文件比較VS對方,或者您可以使用boost::canonical()boost::weekly_canonical()正常化的路徑和使用std::sort這可能是更有效,因爲它不具備比較每對。