文件系統路徑及相對路徑用法 (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()命令,來修改當前的工作目錄,使默認目錄發生改變


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM