Linux上使用程序相對路徑訪問文件【轉】


轉自: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到這個路徑后也可以使用相對路徑了.

 


免責聲明!

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



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