2017-03-22 4 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 Iは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

これはUNIXの感性です。終了する場所はほとんどないので、 'perms'の根源となる0777は、Unix以外のOSには移植できません。 –

+0

@MSaltersでは、普遍的ではなく、OpenVMSが気になります。 –

答えて

1

あなたが正しいとは限りませんが、test./testは通常同じことを指していますが、これはどこにも当てはまりません。

たとえば、./testをシェルでコマンドとして実行すると、現在のディレクトリ内のプログラムとそれ以外の場所は常に検索されます。しかし、testを実行すると、ランタイムパス(たとえば、$PATH)が表示されます。

したがって、test./testが同じファイルを参照するかどうかは、実際にはコンテキストに依存するため、./は冗長ではありません。

+0

私はこれについて頑張り、私は確信していません。 'boost :: filesystem'の文脈でのパスの使い方は文脈依存であってはなりません。私たちは、ターミナルコマンドではなく、ファイルシステムのパスを扱っています。 –

+0

@TonvandenHeuvel:Boost Filesystemでどのようなパスが使われているのですか?実際にこのライブラリを使用して、あとでシェルコマンドで使用されるパスを操作する人がいると私は確信しています。もちろんBoost Filesystemで提供されている単体テストを見ることで、明示的にこの結果を書き留めているかどうかを確認することができます。 –

+0

提案していただきありがとうございます。私はテストケースを見て、ドットプレフィックスはカバーされていません。 –

関連する問題