2016-06-21 2 views
0

I 입력에 std::vector에 저장된 파일의 목록을 소요하는 프로그램이 있습니다벡터에서 중복 파일 이름을 제거

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

는 사용자가 어떤 파일 이름을 입력 완전 무료 (그들이 촬영됩니다 argv에서), 동일한 파일을 참조하는 파일 이름을 입력하면 중복을 무시해야합니다. 문제는 사용자도이 같은 벡터를 갖는 것을 만들 수 있다는 것입니다 : 나는 /path/to에서 프로그램을 호출하고있어 고려

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

을, 세 개의 파일 이름이 같은 파일을 참조하지만 다른 문자열있어 .

fopen() (이 아닌std::ifstream)으로 열어야합니다.

그리고 프로세스를 시작하기 전에 모든 프로그램 fopen()의 모든 파일을 확인해야 문제가되지 않습니다.

중복 된 파일 이름을 효과적으로 제거하는 방법이 있습니까?

+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을 조합하여 중복을 제거 할 수 있습니다.

동일한 파일을 참조하는 동일하지 않은 문자열의 경우; 리눅스에서는 realpath(3)을 사용하여 모든 경로를 벡터에 추가하기 전에 (또는 설정) 모든 경로를 정규화 할 수 있습니다. 나는 Windows에서 동등한 기능을 알지 못하지만, 하나 있다고 확신한다. 아마도 Windows에서이 작업이 필요한 경우 msdn.com을 검색해보십시오.

+0

세트가 사용자가 지정한 파일의 순서를 유지합니까? – NoImaginationGuy

+0

@osnapitzkindle 아니요. 세트는 해당 주문을 보존하지 않습니다. –

+0

다른 많은 언어와 마찬가지로 주문한 세트 또는 이와 유사한 것이 없습니까? – NoImaginationGuy

0

휴대용 솔루션을 위해 당신이 boost::filesystem를 사용할 수 있습니다

boost::equivalent()

는 true를, 경우 SF1 == 같은 파일 시스템 엔티티 SF2 및 P1과 P2의 해결, 그렇지 않은 경우는 false.

이 방법은 서로 대 각 파일을 비교하는 것, 또는 각 쌍을 비교 할 필요가 없기 때문에 당신이 경로를 정상화하고 더 효과적 일 수 std::sort를 사용하는 boost::canonical() 또는 boost::weekly_canonical()를 사용할 수 있습니다.