OpenCV4学习笔记(2.1)Windows系统的文件路径表示法 | ./、../、/、~的作用 | /、//、\、\\等之间的区别 | 字符串的原始字面量R"(...)"
学习OpenCV的过程中,需要读取或者保存图像时,肯定会用到图像的绝对路径或者相对路径。路径这一块很混乱、很复杂,这次主要说一说Windows系统下的文件路径表示方法。
主要内容
-
Windows系统下(CMD和PowerShell)常用的文件路径表示法。
-
文件路径中使用斜杠/、多斜杠//、反斜杠\、多反斜杠的注意事项。
-
文件路径中./、../、/、~的含义。
绝对路径与相对路径
绝对路径是完整路径,是指向文件系统中某个固定位置的路径,不会因为当前工作路径的改变而改变。
相对路径是相对当前工作目录的路径,无需提供完整的绝对路径,文件名称就是一个相对路径。
单斜杠/、多斜杠//、单反斜杠\、多反斜杠的作用
多斜杠、多反斜杠包括双斜杠和双反斜杠。
普通字符串中,单反斜杠不能作为文件路径的分隔符。
在描述文件路径时,单斜杠与多斜杠的作用是一样的,而且可以在一个文件路径字符串中混合使用,这里以文件的绝对路径为例:
String imageName("E:///VS2019//OpenCvPrj/ConsoleApplication1/ConsoleApplication1/rubberwhale1.png"); // 合法
在C++中反斜杠\的作用是比较特殊的(在此先不作展开),所以最好不要使用反斜杠来描述文件路径。
从文件资源管理器复制下来的路径都是用反斜杠分隔的,要是全部修改成斜杠难免有些麻烦,现在有两个办法解决这个问题:
-
将所有的单反斜杠改成多反斜杠,也就是转义后能够得到反斜杠,可以解决字符串错误的续行问题。
-
如果使用的是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" // 使用绝对路径