当前位置: 首页 > news >正文

Linux 目录操作 C/C++ 开发笔记

Linux 目录操作 C/C++ 开发笔记

Linux 目录操作 C/C++ 开发笔记


一、目录操作基础头文件汇总

功能 头文件
目录遍历(opendir/readdir/closedir <dirent.h>
创建目录(mkdir <sys/stat.h>
删除/切换目录、获取当前目录 <unistd.h>

二、常用目录操作函数详解

1. 获取当前工作目录:getcwd()

1.1 函数原型

#include <unistd.h>
char *getcwd(char *buf, size_t size);
  • buf:存放当前目录路径的缓冲区(建议长度 256
  • size:缓冲区大小
  • 返回值:成功返回 buf 地址,失败返回 NULL

1.2 示例代码

#include <iostream>
#include <unistd.h>
using namespace std;int main() {char path[256];if (getcwd(path, sizeof(path)) == NULL) {perror("getcwd");return -1;}cout << "当前工作目录:" << path << endl;return 0;
}

2. 切换工作目录:chdir()

2.1 函数原型

#include <unistd.h>
int chdir(const char *path);
  • path:目标目录路径
  • 返回值:成功返回 0,失败返回 -1

2.2 示例代码

#include <iostream>
#include <unistd.h>
using namespace std;int main() {if (chdir("/home/user") == -1) {perror("chdir");return -1;}char path[256];getcwd(path, sizeof(path));cout << "切换后目录:" << path << endl;return 0;
}

3. 创建目录:mkdir()

3.1 函数原型

#include <sys/stat.h>
int mkdir(const char *pathname, mode_t mode);
  • pathname:要创建的目录路径
  • mode:权限(如 0755,注意必须带前导 0
  • 返回值:成功返回 0,失败返回 -1

3.2 示例代码

#include <iostream>
#include <sys/stat.h>
using namespace std;int main() {if (mkdir("./new_dir", 0755) == -1) {perror("mkdir");return -1;}cout << "目录创建成功" << endl;return 0;
}

4. 删除目录:rmdir()

4.1 函数原型

#include <unistd.h>
int rmdir(const char *path);
  • path:要删除的目录路径(必须为空目录
  • 返回值:成功返回 0,失败返回 -1

4.2 示例代码

#include <iostream>
#include <unistd.h>
using namespace std;int main() {if (rmdir("./new_dir") == -1) {perror("rmdir");return -1;}cout << "目录删除成功" << endl;return 0;
}

三、目录遍历核心函数(opendir/readdir/closedir

1. 核心数据结构

1.1 目录指针 DIR

  • 类型:DIR *
  • 作用:表示一个打开的目录流

1.2 目录项结构体 struct dirent

struct dirent {long d_ino;              // inode 号off_t d_off;             // 在目录文件中的偏移unsigned short d_reclen; // 记录长度unsigned char d_type;    // 文件类型(重点)char d_name[256];        // 文件名(重点)
};

1.3 d_type 常用值

含义 数值(部分系统)
DT_REG 普通文件 8
DT_DIR 目录 4
DT_LNK 符号链接 10
DT_FIFO 管道 1

2. 目录遍历三步骤

2.1 打开目录:opendir()

#include <dirent.h>
DIR *opendir(const char *pathname);
  • 返回值:成功返回目录流指针,失败返回 NULL

2.2 读取目录项:readdir()

struct dirent *readdir(DIR *dirp);
  • 每次调用返回下一个目录项,读完返回 NULL

2.3 关闭目录:closedir()

int closedir(DIR *dirp);
  • 成功返回 0,失败返回 -1

3. 完整示例代码

#include <iostream>
#include <dirent.h>
#include <cstring>
using namespace std;int main(int argc, char *argv[]) {if (argc != 2) {cout << "Usage: " << argv[0] << " <目录名>\n";return -1;}// 1. 打开目录DIR *dir = opendir(argv[1]);if (dir == nullptr) {perror("opendir");return -1;}// 2. 遍历目录项struct dirent *entry;while ((entry = readdir(dir)) != nullptr) {// 跳过 . 和 .. 目录if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {continue;}cout << "文件名:" << entry->d_name << "\t类型:";switch (entry->d_type) {case DT_REG: cout << "普通文件"; break;case DT_DIR: cout << "目录"; break;case DT_LNK: cout << "符号链接"; break;default: cout << "其他(" << (int)entry->d_type << ")"; break;}cout << endl;}// 3. 关闭目录closedir(dir);return 0;
}

四、知识点补充与易错点修正

1. rmdir() 只能删除空目录

  • 如果目录非空,必须先删除所有文件和子目录,再调用 rmdir()

2. mkdir() 权限问题

  • 权限模式必须是八进制,如 0755,不能写成 755
  • 权限受进程的 umask 影响,实际权限为 mode & ~umask

3. readdir() 会自动跳过 ... 吗?

  • 不会,必须手动判断并跳过,否则会遍历到这两个特殊目录

4. 目录操作错误排查

  • 始终用 perror() 打印错误信息,如 perror("opendir")
  • 常见错误:路径不存在、权限不足、目录非空

五、目录操作流程总结

  1. 获取/切换目录getcwd()/chdir()
  2. 创建/删除目录mkdir()/rmdir()
  3. 遍历目录opendir()readdir() 循环 → closedir()
http://www.jsqmd.com/news/764259/

相关文章:

  • 从4秒到无限:Runway Gen2免费版‘拼贴长视频’实战指南(附剪辑思路)
  • 告别环境冲突:用Docker Compose编排Superset全家桶(含PostgreSQL与Redis)
  • 哪家服务商真空设备检测设备齐全?真空技术实力雄厚的服务商推荐 - 品牌推荐大师
  • 云原生进阶方向原理与实战
  • 首驱 Yz Lite 质量靠谱吗?轻通勤小车的配置、价格与长期使用边界 - Top品牌推荐官
  • 终极指南:如何用SQLCoder快速将自然语言转换为SQL查询
  • 手把手教你用EWSA汉化版破解WiFi密码:从抓包到跑包的完整避坑指南
  • 深圳GEO优化服务商推荐(3家靠谱企业)| 本地生活+制造业全覆盖,附实战案例 - 品牌洞察官
  • 别再只把ONNX当个格式了!手把手教你用Python从零构建一个线性回归模型(附完整代码)
  • 基于Transformer的股票市场多因子量化选股模型,深度解析:基于Transformer的股票市场多因子量化选股模型
  • GIS小白也能看懂的实战:5步教你将ArcGIS里的等高线和水系完美导入CAD做规划图
  • 终极蓝光技术分析工具BDInfo完全指南:从入门到精通
  • 热脱附设备选购关注点:品质好、性能强的品牌 - 品牌推荐大师1
  • 苏州鼎轩废旧电子产品:太仓专业的线路板回收公司推荐几家 - LYL仔仔
  • 2026在线网盘深度解析:为什么坚果云是企业与个人数据管理的综合优选?
  • #2026最新沙发皮革材料公司推荐!广东优质权威榜单发布,品质靠谱佛山等地皮革供应商精选 - 十大品牌榜
  • 某总部经济园办公楼群引入瑞冬地源热泵集中能源站
  • MacBook上FFmpeg全家桶安装指南:Homebrew一键搞定与手动配置全流程
  • 从备份到治理:workspace-archiver如何重塑文档管理工程实践
  • 告别手动复制粘贴:用C#和TIA Portal API批量导入HMI文本列表(附完整源码)
  • 鸣潮工具箱:如何用开源工具一键解锁120FPS与深度抽卡分析
  • Word 练习题(7)
  • 保姆级教程:用Python复现CVPR 2018视频异常检测经典算法(附代码)
  • 文本到视频生成技术的多维度评估体系与实践
  • 首驱、宝岛、九号、极核、台铃、雅迪哪个好?一篇讲清六大电动车品牌怎么选 - Top品牌推荐官
  • 国产智能体如何选?OpenClaw本地化替代方案深度解析 - 品牌2025
  • ComfyUI-WanVideoWrapper:零基础入门AI视频生成的完整指南
  • GPT-5.5适合哪些行业?企业落地应用场景全解析
  • VQ-VA WORLD框架:视觉问答技术的突破与应用
  • Python新手必看:TypeError: ‘str‘ object is not callable 的3个真实踩坑案例与修复