2017-03-22 38 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(使用Boost 1.63.0),在那裏我會想到test

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

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

所以第一點元件不被認爲是多餘的。但是,使用boost文件系統時,test./test顯然會解析爲同一個文件,所以這對我來說似乎不一致。這是預期的行爲?

+0

你在這裏隱含地假設'test'是一個相對路徑。這在便攜式代碼中是一個危險的假設。 '。/ test'是明確的相對。 – MSalters

+1

這是一個Unix的感性。幾乎沒有它結束的地方,'perms'的0777永遠不會轉移到非Unix操作系統。 –

+0

@MSalters,不是普遍的OpenVMS。 –

回答

1

這是合理的行爲,因爲雖然你是正確的,test./test通常指的是相同的東西,但情況並非如此。

例如,如果在shell中運行./test作爲命令,它將始終在當前目錄中查找該程序,而不會在其他地方查找該程序。但是,如果運行test,它會查找運行時路徑(例如$PATH)。

因此,test./test指的是相同的文件實際上取決於上下文 - 因此./不是多餘的。

+0

我想到這一點,我不相信。 'boost :: filesystem'上下文中路徑的使用不應該取決於上下文。我們正在處理文件系統路徑,而不是終端命令。 –

+0

@TonvandenHeuvel:我們要說誰在Boost文件系統中使用了什麼樣的路徑?我相當確定有些人實際上會使用這個庫來操作稍後在shell命令中使用的路徑。當然,您可以隨時查看Boost Filesystem中提供的單元測試,看看他們是否明確注意到了這個結果。 –

+0

感謝您的建議。我看了一下測試用例,沒有涉及點前綴。 –

相關問題