2016-04-29 12 views
1

としてはdocumentationで説明し、次の予想される出力は次のようになります。parent_path()とや末尾のスラッシュなし

boost::filesystem::path filePath1 = "/home/user/"; 
cout << filePath1.parent_path() << endl; // outputs "/home/user" 

boost::filesystem::path filePath2 = "/home/user"; 
cout << filePath2.parent_path() << endl; // outputs "/home" 

質問は、どのようにこの問題に対処しますか?つまり、引数としてパスを受け入れると、後ろにスラッシュがあるかどうかをユーザーが気にする必要はありません。一番簡単な方法は、私が欲しい「/ホーム」の親パスを取得するにはTWICE parent_path()を呼び出し、その後、末尾にスラッシュを追加することであろうように思える:

boost::filesystem::path filePath1 = "/home/user/"; 
filePath1 /= "/"; 
cout << filePath1.parent_path().parent_path() << endl; // outputs "/home" 

boost::filesystem::path filePath2 = "/home/user"; 
filePath2 /= "/"; 
cout << filePath2.parent_path().parent_path() << endl; // outputs "/home" 

が、それはばかげているようです。フレームワーク内でこれを処理するより良い方法はありますか?私が代わりにparent_path() 2回呼び出すのディレクトリstringと、前の操作を行うことをお勧めだろうが

答えて

4

(?文書化されていない)メンバ関数はpath& path::remove_trailing_separator();

あり、私はこれを試してみましたが、それはブースト1.60.0を使用してWindows上で私のために働い:

boost::filesystem::path filePath1 = "/home/user/"; 
    cout << filePath1.parent_path() << endl; // outputs "/home/user" 
    cout << filePath1.remove_trailing_separator().parent_path() << endl; // outputs "/home" 

    boost::filesystem::path filePath2 = "/home/user"; 
    cout << filePath2.parent_path() << endl; // outputs "/home" 
    cout << filePath2.remove_trailing_separator().parent_path() << endl; // outputs "/home" 
+0

@Nachoここに行く:) –

+0

興味深いことに、これは複数の末尾の区切り文字を処理しません。 –

+0

あなたは 'filePath1.lexically_normal().remove_trailing_separator()。parent_path()'を使うことができましたが、探し始めます( "/ home/user //")remove_trailing_separator()。parent_path奇妙なaigain .. – Wurmloch

1

は、それのように思える:

std::string directory = "/home/user"; // Try with "/home/user/" too, result is the same 

while ((directory.back() == '/') || (directory.back() == '\\'))) 
    directory.erase(directory.size()-1);  

boost::filesystem::path filePath(directory); 
std::cout << filePath.parent_path() << std::endl; // outputs "/home" 

std::string::back()は、C++ 11の機能であることに注意することが重要です。以前のバージョンでコンパイルする必要がある場合は、アルゴリズムを少し変更する必要があります。

+0

まだ非常に手動でそれ。 UNIX以外のシステムにいる場合は、 '\'もチェックする必要があります。そして、おそらく、後ろに '//'もチェックする必要があります。boost :: filesystemに "justHandleItCorrectly(directory)"のようなものがあるかどうか聞いていました:) –

+0

@DavidDoria確かに、答えを削除した後、あなたが言及したケースを処理するためのロジックは、それをチェックアウトします。 – Nacho

+0

確かに、これは完全に有効です(しかし、いつも '\\\'などについてはどうでしょうか)。しかし、私の主張は、私には普通のことです。取り扱いについてはこの機能で直感的ではない方法で失敗するようです。誰もがこれを自分で処理するようにするのは愚かなようだ。通常、これがブーストの場合、誰かが私が逃した関数を指しているだけです:) –

関連する問題