2009-09-23 3 views
3

디스크 파일 구조에 대한 사용자 지정을 관리하고 연결되지 않은 시스템과 동기화하는 코드를 작성 중입니다. 내 요구 사항 중 하나는 실제로 동기화 내용을 생성하기 전에 동기화 크기를 예측할 수 있어야한다는 것입니다. 간단한 해결책으로, 이미 스캔 된 컨텐츠를 효율적으로 검색하기위한 핵심 경로로 전체 경로 파일 이름이 포함 된지도를 작성했습니다.경로 단순화/축소

다른 방법으로 다른 위치에서 참조 된 파일 구조에 여러 파일이있을 때이 문제가 발생합니다. 예 :

C:\DataSource\files\samplefile.txt 
C:\DataSource\data\samples\..\..\files\samplefile.txt 
C:\DataSource\etc\..\files\samplefile.txt 

이러한 3 개의 경로 문자열은 모두 디스크상의 동일한 파일을 참조하지만 문자열 표현은 다릅니다. 이러한 것들을 그대로 축 어적으로 삽입한다면, 나는 samplefile.txt의 크기를 세 번 계산할 것이고, 예상치는 틀릴 것입니다.

이 문제를 해결하기위한 방법으로 boost :: filesystem :: path가 경로를 줄이거 나 단순화하는 기능을 제공하지만 기대했던 바가 없었습니다. 경로 분해 테이블 ​​및 경로 반복자를 사용하여, 나는 (Windows 환경에서 사용하기 위해) 다음 함수를 쓴 :

std::string ReducePath(std::string Path) 
{ 
    bfs::path input(Path); 
    bfs::path result(""); 
    bfs::path::iterator it, endIt; 
    for(it = input.begin(), endIt = input.end(); it != endIt; it ++) 
    { 
     if((*it) == "..") 
     { 
      // Remove the leaf directory. 
      result = result.parent_path(); 
     } 
     else if((*it) == ".") 
     { 
      // Just ignore. 
     } 
     else 
     { 
      // Append the element to the end of the current result. 
      result /= (*it); 
     } 
    } 

    return result.string().c_str(); 
} 

나는 두 가지 질문이 있습니다.

하나, 이런 종류의 기능을 제공하는 표준 기능이 있습니까, 아니면 이미 부스트 또는 다른 라이브러리 어딘가에 존재합니까?

둘째, 필자가 작성한 기능이 모든 경우에 작동 할 것이라고 확신하지 못하고 있으며, 이에 대해 좀 더 알고 싶습니다. 그것은 내 테스트에서 작동합니다. 누구가 붕괴 될 사건을 본 사람이 있습니까?

+0

호출. 보다 일반적인 유행어를 사용하려면 제목과 질문을 변경하십시오. –

+0

두 개의 점이 뒤따라 결과로 제거되는 경로 구성 요소가 실제로는 원래 경로와 동일한 파일 시스템 개체를 참조하지 않는 결과 경로를 생성 할 수있는 한 가지 시나리오가 있습니다. 다른 디렉토리. 세 번째 예에서 * C : \ DataSource \ etc *가 * D : \ tmp \ someDir *에 대한 심볼릭 링크 였는지 상상해보십시오. * C : \ DataSource \ etc \ .. \ files \ samplefile.txt *를 * C : \ DataSource \ files \ samplefile.txt *로 단순화하려면 실제로 동일한 파일을 참조하지 않을 수도 있습니다.하지만 boost :: filesystem :: is_symlink를 통해 항상 확인할 수 있습니다. – antred

+0

Nevermind, 나는 단지이 질문이 6 년 전에 요청되었고, boost :: filesystem은 이제 그 당시에는 없었던 _canonical() _ 기능을 가지고 있음을 깨달았습니다. – antred

답변

2

있다;

두 경로가 동일한 지 확인합니다. 이는 등가 인 < 연산자가 없다는 점을 제외하고는 이상적입니다 (어쩌면 불가능할 수도 있음).

사람이 휴식하는 경우를 볼 수 있나요 ...

어쩌면; "../test.txt"와 같은 입력이 있으면 부모 경로가 원하는 것을 수행하지 못할 수 있습니다. 먼저 경로를 완료하는 것이 좋습니다.

파일 시스템 라이브러리에서 "complete"를 참조하십시오. 이 파일에 대한 "표준"경로를 생성

행운 --Robert 넬슨