2017-03-22 2 views
6

boost::filesystem::path::lexically_normal() 상태의 문서 :boost :: filesystem :: path :: lexically_normal :이 잘못된 동작입니까?

반환 제거 중복 현재 디렉토리 (점), 상위 디렉토리 (점 점), 및 디렉토리 분리 요소 *this.

참조 : http://www.boost.org/doc/libs/1_63_0/libs/filesystem/doc/reference.html.

다음 인쇄 ./test 내가 test을 기대하는 곳 (부스트 1.63.0을 사용하여이) :

#include <boost/filesystem/path.hpp> 
#include <iostream> 

int main(void) 
{ 
    std::cout << boost::filesystem::path{"./test"}.lexically_normal().string() << "\n"; 
    return 0; 
} 

은 그래서 첫 번째 점의 요소는 중복으로 간주되지 않습니다. 그러나, 부스트 파일 시스템을 사용할 때 test./test 모두 분명히 동일한 파일로 해석되기 때문에 이것은 나에게 모순이되는 것처럼 보입니다. 이 예상되는 동작입니까?

+0

여기서'test '는 상대 경로라고 암묵적으로 가정합니다. 이것은 휴대용 코드에서 위험한 가정입니다. './test'는 분명히 상대적입니다. – MSalters

+1

유닉스 감성입니다. 끝나는 곳이 거의 없기 때문에 'perms'를 뿌리 내리는 0777은 결코 유닉스가 아닌 OS에 잘 포팅되지 않습니다. –

+0

@MSalters, 보편적으로, OpenVMS가 떠오른다. –

답변

1

당신이 맞지만 비록 test./test이 일반적으로 같은 것을 참조하기 때문에 합당한 행동입니다. 이것은 모든 경우에 해당하지 않습니다.

예를 들어, ./test을 쉘에서 명령으로 실행하면 현재 디렉토리와 그 밖의 다른 곳에서 해당 프로그램을 항상 찾습니다. 하지만 test을 실행하면 런타임 경로 (예 : $PATH)가 대신 표시됩니다.

따라서 test./test이 실제로 동일한 파일을 참조하는지 여부는 실제로 컨텍스트에 따라 다르기 때문에 ./은 중복되지 않습니다.

+0

나는 이것에 대해 강경하며, 나는 확신하지 못한다. 'boost :: filesystem' 문맥에서 경로의 사용은 문맥 의존적이어서는 안됩니다. 우리는 터미널 명령이 아닌 파일 시스템 경로를 다루고 있습니다. –

+0

@TonvandenHeuvel : Boost Filesystem에서 어떤 종류의 경로가 사용되는지 말해야합니까? 나는 어떤 사람들이 나중에 쉘 명령어에서 사용되는 경로를 조작하기 위해 실제로이 라이브러리를 사용할 것이라고 확신한다. 물론 부스트 파일 시스템 (Boost Filesystem)에서 제공되는 유닛 테스트를 통해 명시 적으로이 결과를 기록하는지 확인할 수 있습니다. –

+0

제안 해 주셔서 감사합니다. 테스트 케이스를 살펴 보았습니다. 점 접두어는 다루지 않았습니다. –

관련 문제