2017-03-22 66 views
6

Dokumentacja boost::filesystem::path::lexically_normal() stanów:boost :: filesystem :: path :: lexically_normal: czy to nieprawidłowe zachowanie?

Zwraca *this z nadmiarowym katalogu bieżącego (kropka), katalog nadrzędny (kropka-kropka), a katalog elementów separatora usunięte.

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

następujące wydruki ./test (przy użyciu Boost, 1.63.0) gdzie spodziewałbym test:

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

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

więc pierwszym elementem kropka nie jest uważane za zbędne. Jednak zarówno przy test jak i ./test można rozwiązać ten sam plik przy korzystaniu z systemu plików doładowania, więc wydaje mi się to niespójne. Czy to oczekiwane zachowanie?

+0

Zakłada się tu domyślnie, że "test" jest ścieżką względną. To niebezpieczne założenie w przenośnym kodzie. './test' jest jednoznacznie względny. – MSalters

+1

Jest to wrażliwość uniksowa. Gdziekolwiek się kończy, 0777, że root 'perms' nigdy nie będzie dobrze portowany do systemu operacyjnego innego niż Unix. –

+0

@MSalters, nie powszechnie, przychodzi na myśl OpenVMS. –

Odpowiedz

1

Jest to uzasadnione zachowanie, ponieważ chociaż masz rację, że test i ./test zwykle odnoszą się do tego samego, nie wszędzie tak jest.

Na przykład, jeśli uruchomisz ./test jako polecenie w powłoce, zawsze będzie szukać tego programu w bieżącym katalogu i nigdzie indziej. Ale jeśli uruchomisz test, będzie on wyglądał w ścieżce środowiska wykonawczego (na przykład $PATH).

Tak więc, czy test i ./test odnoszą się do tego samego pliku, zależy to od kontekstu - dlatego ./ nie jest zbędny.

+0

Myślałem o tym i nie jestem przekonany. Używanie ścieżek w kontekście 'boost :: filesystem' nie powinno być zależne od kontekstu. Mamy do czynienia ze ścieżkami systemu plików, a nie z komendami terminalowymi. –

+0

@TonvandenHeuvel: Kim jesteśmy, aby powiedzieć, jakie ścieżki są używane w systemie plików Boost? Jestem pewien, że niektórzy ludzie w rzeczywistości używają tej biblioteki do manipulowania ścieżkami, które są później używane w poleceniach powłoki. Oczywiście zawsze możesz przyjrzeć się testom jednostkowym podanym w Boost Filesystem, aby zobaczyć, czy wyraźnie zauważają ten wynik. –

+0

Dzięki za sugestię. Spojrzałem na przypadki testowe, prefiks kropki nie jest objęty. –