2016-06-21 6 views
0

で重複するファイル名を削除します。私は入力に<code>std::vector</code>に保存されているファイルのリストを受け取り、プログラムを持っているベクトル

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

ユーザーは任意のファイル名を入力して完全に自由である(それらが取られargv)、同じファイルを参照するファイル名が入力された場合は、は、の重複を無視する必要があります。私は3人のファイル名が同じファイルを参照して、/path/toからプログラムを呼んでいるが、彼らは別の文字列だ考えると

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

: 問題は、ユーザーがさえベクトルがこのような何かを持っ作ることができるということです。

fopen()ではなく、std::ifstream)で開く必要があります。

そして、すべてのファイルをチェックしてプロセスを開始する前にすべてのファイルを確認してください。問題はありません。

重複するファイル名を効率的に削除する方法はありますか?

+2

私たちはちょうどセットではないのですか? –

+2

最初のステップは、完全なパス、 '/'で '/'を置き換えた後、単純なタスク – vu1p3n0x

+1

[Might help](http://www.boost.org/doc/libs)を同じ形式に正規化することです/1_48_0/libs/filesystem/v3/doc/reference.html#canonical)。それが動作するためのパスが存在しなければならず、 'if(exists){...}'を実行することは、あなたがそれを使用する時まで存在しない可能性があるため、十分ではないことに注意してください。 – chris

答えて

2

ベクトルではなくstd::setを使用して、同一の文字列が1回だけリストされるようにすることができます。

代わりにすることができますstd::sort(又はstd::stable_sort)ベクター、次いで重複を除去するstd::erase組み合わせるstd::uniqueを使用します。

同じファイルを参照する同一でない文字列については、 Linuxではrealpath(3)を使用してすべてのパスをベクトル(またはセット)に追加する前に正規化することができます。私はWindows上の同等の機能を知らないが、私は確信している。おそらくmsdn.comで検索してみてください。これが必要な場合は、Windowsで作業してください。

+0

セットはユーザーが指定したファイルの順序を保持しますか? – NoImaginationGuy

+0

@osnapitzkindleいいえ。セットはその注文を保存しません。 –

+0

他の多くの言語と同様に、そのような順序のセットなどはありませんか? – NoImaginationGuy

0

ポータブルソリューションについてごboost::filesystemを使用することができます。

boost::equivalent()

はtrueを、もしSF1 ==同じファイル システムエンティティにSF2及びP1およびP2の決意、それ以外の場合はfalse。

この方法であなたが互いに対それぞれのファイルを比較する必要があります、またはそれは、各ペアを比較する必要がないよう、あなたがパスを正規化し、より効果的である可能性がstd::sortを使用するboost::canonical()boost::weekly_canonical()を使用することができます。

関連する問題