轉自:http://blog.csdn.net/yinxusen/article/details/7444249
今天一個朋友問我這個問題,說為什么在Windows上跑得很好的應用程序,移植到Linux上后就讀不到跟應用程序在同一文件夾下的文件呢,我說,這是linux和Windows在Work directory上設置的不同。 大家都知道,對於Windows而言,應用程序的默認工作目錄就是應用程序所在的目錄,它一般是不管應用程序是從哪個目錄上下文啟動的。那么在不更改工作目錄的情況下,讀文件使用相對目錄就肯定是相於應用程序所在的目錄。 但對於Linux而言,應用程序的默認工作目錄就不同了,它是默認是繼承啟動它的進程的工作目錄的,也就是說,如果進程是在其它目錄下啟動,那應用程序的工作目錄默認就在其它的目錄下。這樣的話使用相對路徑訪問文件就有很大的不確定性:我們永遠也不能保證,用戶一定是從應用程序所在的目錄啟動! 那要怎么解決呢,我給的建議是,在程序啟動后,修改應用程序的當前目錄到應用程序所在的目錄,然后其它所有程序都無須改動。最好的辦法當然只有一個,那就是通過main函數傳入的argv[0]計算出當前目錄。 下面的例子是讀取跟應用程序所在同一目錄的a.txt文件並顯示,程序啟動后修改當前工作目錄為應用程序所在的目錄,所以不管應用程序從哪個目錄啟動,程序都能正確地讀到a.txt這個文件。 01 #include <stdio.h> 02 #include <string.h> 03 #include <libgen.h> 04 #include <unistd.h> 05 06 void main(int argc,char* argv[]){ 07 char buf[256]; 08 chdir(dirname(argv[0])); //設置當前目錄為應用程序所在的目錄。其實,就只要加入這一句,就可以使用windows一樣的方式用相對路徑打開文件了! 09 FILE* fp=fopen("./a.txt","r"); 10 if(fp==NULL){ 11 printf("Can't read file ./a.txt\n"); 12 return; 13 } 14 fread(buf,255,1,fp); 15 fclose(fp); 16 printf("%s\n",buf); 17 } 在shell中同樣可以保證使用相對路徑,同樣的,$0參數是調用命令,使用`dirname $0`,可取得shell腳本的真實路徑.cd到這個路徑后也可以使用相對路徑了.