文件系统路径及相对路径用法 (linux 和 windows)
1.系统默认分隔符
一般意义下文件的系统路径在windows下使用 '\\' 分隔(转义后即'\'字符),在LINUX下使用‘/’分隔
针对一个一般的控制台工程,因为argv的第0组参数就是当前程序执行的路径,我们可以使用如下代码看到在不同系统下的结果
int main(int argc, char** argv) { printf("%s\n",*argv); }
比如我分别在Win和Linux下 获得如下结果:
Windows:
C:\Users\xyl\projects\ConsoleApplication1\x64\Debug\ConsoleApplication3.exe
Linux:
/home/xyl/projects/remoteCons/bin/x64/Debug/remoteCons.out
2.其他分隔符
那么我们是否可以混用系统分隔符呢,以fopen为例,看下面的实验代码(linux imageName1 路径更换为"/home/xyl/projects/remoteCons/bin/x64//Debug\\abc.txt";)
string imageName = "C://Users//xyl//source//repos/ConsoleApplication3\\abc.txt"; string imageName1 = ".//abc1.txt"; string imageName2 = ".\\abc2.txt"; string imageName3 = "./abc3.txt"; { std::unique_ptr<FILE, decltype(&fclose)> fp(fopen(imageName.c_str(), "wb+"), &fclose); if (fp) { fwrite("abc", sizeof(char), 3, fp.get()); } std::unique_ptr<FILE, decltype(&fclose)> fp1(fopen(imageName1.c_str(), "wb+"), &fclose); if (fp1) { fwrite("abc", sizeof(char), 3, fp1.get()); } std::unique_ptr<FILE, decltype(&fclose)> fp2(fopen(imageName2.c_str(), "wb+"), &fclose); if (fp2) { fwrite("abc", sizeof(char), 3, fp2.get()); } std::unique_ptr<FILE, decltype(&fclose)> fp3(fopen(imageName3.c_str(), "wb+"), &fclose); if (fp3) { fwrite("abc", sizeof(char), 3, fp3.get()); } }
在windows下运行后,在对应目录下都成功生成了上述四个文件,也就是说上述文件路径都是有效的,并且不论重复多少个'/'或者'\'其实结果都是相同的
在linux(Ubuntu)下运行后在程序当前目录下生成了3个文件,其中1和3是我们期望的,而abc2.txt直接使用了整个字符串作为文件名(因为默认生成路径为当前执行文件目录)。同样可以在上级目录中发现一个Debug\abc.txt文件
xyl@worker-node1:~/projects/remoteCons/bin/x64/Debug$ ls -a . .. abc1.txt '.\abc2.txt' abc3.txt remoteCons.out
由此,在 windows下可以随意使用 '/' 或者'\\'作为文件路径分隔符,而在linux下必须使用 '/'作为文件路径分隔符,分隔符的数量并没有影响
同时注意,如果打开文件的目录找不到,则fopen也不会成功
3.相对路径
. 代表默认目录
.. 代表当前目录的上一级目录
/ Linux下代表根目录
如果上述文件都不加路径即'abc.txt'与'./abc.txt'效果相同,则都是生成在默认目录下。
具体默认目录是在哪里,和编译器有一定关系:
在windows下:vs调试时是在工程所在目录, 运行时使用可执行程序的目录
在linux下则是可执行程序的目录,不过也可以通过调用chdir()命令,来修改当前的工作目录,使默认目录发生改变