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()命令,來修改當前的工作目錄,使默認目錄發生改變