最近在寫項目時遇到一個問題
pcl@robot:~/cProject/projects/myPro/mpRPC$ ls
autobuild.sh bin build CMakeLists.txt conf example lib log README.md src test
如上所示,我的項目根目錄里有一個log文件夾和一個bin文件夾,我的需求是
- bin目錄下存放可執行程序
- log目錄下存放日志文件
但是在寫代碼的時候遇到了以下問題
如何在任意目錄下運行bin目錄下的可執行程序,都能讓代碼找到log目錄,從而正確的將日志文件寫入到log目錄內呢?
最終在linux中找到了一個函數,如下:
在Linux系統下,
realpath
函數用于獲取指定路徑的絕對路徑名。該函數可以處理所有類型的路徑,包括相對路徑、符號鏈接等,最終返回一個規范化的絕對路徑。以下是
realpath
函數的基本使用方法:#include <unistd.h> char *realpath(const char *path, char *resolved_path);
path
:要解析的路徑名。resolved_path
:用于存儲解析后絕對路徑的緩沖區。
這樣我就可以首先通過可執行程序的文件路徑找到項目根目錄,再找到log文件夾了
std::string getWorkDirectory() {char resolved_path[512];if (realpath("/home/pcl/cProject/projects/myPro/mpRPC/bin", resolved_path) != NULL) {std::string path = std::string(resolved_path);size_t found = path.find_last_of("/");return path.substr(0, found);} else {return ""; // 返回空字符串表示獲取當前工作目錄失敗}
}
?
char filename[512]={0};
sprintf(filename,"%d-%d-%d-log.txt",nowtm->tm_year+1900,nowtm->tm_mon+1,nowtm->tm_mday);std::string rootPath=getWorkDirectory();
std::string logPath=rootPath+"/log/"+std::string(filename);
// std::cout<<"logPath:"<<logPath<<std::endl;
FILE* pf=fopen(logPath.c_str(),"a+");
if(!pf)
{std::cout<<"log file "<<filename<<" open error!"<<std::endl;exit(EXIT_FAILURE);
}
但是寫完之后我發現了一個愚蠢的問題,為什么我不直接把路徑拼接上去呢?