在Linux环境开发中,有时我们需要获取文件路径,文件名等信息,比如读取目录下的所有文件,这个目录可能下面还有子目录,以及文件,本篇记录Linux环境编程文件路径操作之realpath, dirname, basename的基本用法。
首先查看帮助文档
1.realpath函数是 Linux 系统中的一个标准库函数,用于将给定的相对路径转换为绝对路径。
函数名 | realpath |
相关函数 | dirname, basename |
表头文件 | #include <limits.h> #include <stdlib.h> |
函数定义 | char *realpath(const char *path, char *resolved_path); |
函数说明 | 用于将给定的相对路径转换为绝对路径。该函数会解析所有的符号链接并返回最终的实际路径。 如果resolved_path参数传nullptr,则系统会分配内存返回该路径地址,记得free(returnpath) |
返回值 | 成功返回实际路径,失败nullptr |
示例:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <error.h>
#include <limits.h>
using namespace std;
int main()
{
char absolutePath[PATH_MAX]={'\0'};
char *pRet = realpath("./realpath_test.txt", absolutePath);
printf("pRet: %s\n", pRet);
printf("absolutePath: %s\n", absolutePath);
char *dynamicPath = realpath("./realpath_test.txt", nullptr);
if(dynamicPath != nullptr) {
printf("dynamicPath: %s\n", dynamicPath);
free(dynamicPath);
}
else {
perror("Failed to resolve path dynamically");
}
cout << "Hello Ubuntu1804!" << endl;
return 0;
}
运行结果:
2.dirname函数用于从给定的路径字符串中提取目录部分。
函数名 | dirname |
相关函数 | realpath, basename |
表头文件 | #include <libgen.h> |
函数定义 | char *dirname(char *path); |
函数说明 |
参数:path 输入的完整路径字符串。 需要注意的是, |
|
示例:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <error.h>
#include <limits.h>
#include <libgen.h>
#include <string.h>
using namespace std;
int main()
{
char path[64] = "/home/scott/projects/getIP.c";
//复制路径以防被修改
char *tempPath = strdup(path);
char *retDir = dirname(tempPath);
printf("orgPath: %s\n", path);
if(retDir != nullptr) {
printf("retPath: %s\n", retDir);
free(tempPath);
}
else {
perror("dirname Failed");
}
cout << "Hello Ubuntu1804!" << endl;
return 0;
}
运行结果:
3.basename函数是 Linux 系统中的一个标准库函数,用于完成路径的最后一个分量,即文件名。
函数名 | basename |
相关函数 | dirname, realpath |
表头文件 | #include <libgen.h> |
函数定义 | char *basename(char *path); |
函数说明 |
参数:path可以是绝对路径也可以是相对路径。 |
返回值 | 成功返回指向输入字符串中最后组件的指针,通常是文件名部分,失败nullptr |
示例:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <error.h>
#include <limits.h>
#include <libgen.h>
#include <string.h>
using namespace std;
int main()
{
char path[64] = "/home/scott/projects/getIP.c";
//char path[64] = "./realpath_test.txt";
//复制路径以防被修改
char *tempPath = strdup(path);
char *fileName = basename(tempPath);
if(fileName != nullptr) {
printf("fileName: %s\n", fileName);
free(tempPath);
}
else {
perror("basename Failed");
}
cout << "Hello Ubuntu1804!" << endl;
return 0;
}
运行结果:
参考: