文件系统路径及相对路径用法 (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()命令,来修改当前的工作目录,使默认目录发生改变

posted on 2021-10-20 15:09  二十一级厨子  阅读(2224)  评论(0编辑  收藏  举报

导航