1. 程式人生 > 實用技巧 >OpenCV4學習筆記(2.1)Windows系統 | 檔案路徑表示法 | ./、../、/、~的作用 | /、//、\等之間的區別 | 字串的原始字面量R"(...)"

OpenCV4學習筆記(2.1)Windows系統 | 檔案路徑表示法 | ./、../、/、~的作用 | /、//、\等之間的區別 | 字串的原始字面量R"(...)"

學習OpenCV的過程中,需要讀取或者儲存影象時,肯定會用到影象的絕對路徑或者相對路徑。路徑這一塊很混亂、很複雜,這次主要說一說Windows系統下的檔案路徑表示方法。

主要內容

  • Windows系統下(CMD和PowerShell)常用的檔案路徑表示法。

  • 檔案路徑中使用斜槓/、多斜槓//、反斜槓\、多反斜槓的注意事項。

  • 檔案路徑中./、../、/、~的含義。

絕對路徑與相對路徑

絕對路徑是完整路徑,是指向檔案系統中某個固定位置的路徑,不會因為當前工作路徑的改變而改變。

相對路徑是相對當前工作目錄的路徑,無需提供完整的絕對路徑,檔名稱就是一個相對路徑。

單斜槓/、多斜槓//、單反斜槓\、多反斜槓的作用

多斜槓、多反斜槓包括雙斜槓和雙反斜槓。

普通字串中,單反斜槓不能作為檔案路徑的分隔符。

在描述檔案路徑時,單斜槓與多斜槓的作用是一樣的,而且可以在一個檔案路徑字串中混合使用,這裡以檔案的絕對路徑為例:

String imageName("E:///VS2019//OpenCvPrj/ConsoleApplication1/ConsoleApplication1/rubberwhale1.png"); // 合法

在C++中反斜槓\的作用是比較特殊的(在此先不作展開),所以最好不要使用反斜槓來描述檔案路徑。

從檔案資源管理器複製下來的路徑都是用反斜槓分隔的,要是全部修改成斜槓難免有些麻煩,現在有兩個辦法解決這個問題:

  1. 將所有的單反斜槓改成多反斜槓,也就是轉義後能夠得到反斜槓,可以解決字串錯誤的續行問題。

  2. 如果使用的是C++11及以上標準的C++語言,那麼可以嘗試使用該標準新加入的特性——字串的原始字面量,來解決字串錯誤的的轉義和續行問題。

    對於這種字串,編譯器將不會對其中的轉義字元進行轉義或者任何其他操作,將保留字串的原始值。

按照下面的語法,將原字串改寫成轉義反斜槓和字串的原始字面量均可。

String imageName("E:\VS2019\OpenCvPrj\ConsoleApplication1\ConsoleApplication1\rubberwhale1.png"); // 非法

String imageName("E:\\VS2019\\\OpenCvPrj\\\\ConsoleApplication1\\ConsoleApplication1\\rubberwhale1.png"); // 轉義反斜槓 合法

String imageName(R"(E:\VS2019\OpenCvPrj\ConsoleApplication1\ConsoleApplication1\rubberwhale1.png)"); // 字串的原始字面量 合法

改寫後的字串,仍然可以混合使用斜槓、多斜槓、多反斜槓作為分隔符。

./、../、/、~的作用

只討論斜槓在普通字串中的情況,反斜槓同樣存在上面的問題,不在進行討論。

./:表示當前工作目錄。

../:表示當前工作目錄的上層目錄(父目錄),可以不斷疊加,../../為二級父目錄,依此類推。

/:表示當前碟符的根目錄

~:在PowerShell中表示家目錄,預設為C:/User/username。

D盤根目錄下中存在如下檔案路徑結構:

├─ father

│ └── current

│ ├── main.cpp

│ └── 1.jpg

│ └── source

​ └── 2.jpg

main.cpp是當前編寫的程式碼檔案,我們希望程式能夠讀取1.jpg和2.jpg。

  • 1.jpg的檔案路徑:

    "1.jpg" // 使用檔名作為相對路徑
    "./1.jpg" // 使用./表示當前目錄
    "/father/current/1.jpg" // 使用/表示當前碟符的根目錄
    "../current/1.jpg" // 使用../表示當前目錄的父目錄(上級目錄)
    "D:/father/current/1.jpg" // 使用絕對路徑
    
  • 2.jpg的檔案路徑:

    "../source/2.jpg" // 使用../表示當前目錄的父目錄
    "/father/source/2.jpg" // 使用/表示當前碟符的根目錄
    "D:/father/source/2.jpg" // 使用絕對路徑
    

參考網站