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:VS2019OpenCvPrjConsoleApplication1ConsoleApplication1
ubberwhale1.png"); // 非法

String imageName("E:\VS2019\OpenCvPrj\\ConsoleApplication1\ConsoleApplication1\rubberwhale1.png"); // 转义反斜杠 合法

String imageName(R"(E:VS2019OpenCvPrjConsoleApplication1ConsoleApplication1
ubberwhale1.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" // 使用绝对路径
    

参考网站

原文地址:https://www.cnblogs.com/LYT-Dveloper/p/13526576.html