Linux 目录操作详解
Linux目录操作详解
- 1. 获取当前工作目录
- 1.1 getcwd()
- 1.2 get_current_dir_name()
- 2. 切换工作目录
- 2.1 chdir()
- 3. 创建和删除目录
- 3.1 mkdir()
- 3.2 rmdir()
- 4. 获取目录中的文件列表
- 4.1 opendir() 打开目录
- 4.2 readdir() 读取目录内容
- 4.3 closedir() 关闭目录
- 5. dirent 结构体
- 6. 示例代码
- (1) 获取当前工作目录
- (2)切换工作目录
- (3)创建和删除目录
- (4)遍历目录中的文件
- (5)结合所有操作的示例
本文将介绍常用的Linux目录操作函数,包括获取当前工作目录、切换工作目录、创建和删除目录等操作。
1. 获取当前工作目录
Linux提供了两个常用函数来获取当前工作目录。
1.1 getcwd()
该函数用于获取当前进程的工作目录,并将路径存储在用户提供的缓冲区中。
函数原型:
char *getcwd(char *buf, size_t size);
buf
:存储当前工作目录路径的缓冲区。size
:缓冲区的大小。
如果成功,返回当前工作目录的路径;如果失败,返回NULL
,并设置errno。
1.2 get_current_dir_name()
这是一个较为简化的函数,不需要传入缓冲区,它会动态分配内存来存储当前目录的路径。
函数原型:
char *get_current_dir_name(void);
调用此函数后,返回的字符串指向当前工作目录的路径,使用完后需要调用free()
来释放内存。
2. 切换工作目录
切换工作目录的操作在文件操作中经常会用到。Linux提供了一个函数chdir()
来实现该操作。
2.1 chdir()
该函数用于改变当前进程的工作目录。
函数原型:
int chdir(const char *path);
path
:目标目录的路径。
返回值:
- 成功:返回0。
- 失败:返回-1,
errno
会被设置为具体的错误码(如目录不存在或权限不足)。
3. 创建和删除目录
3.1 mkdir()
用于创建一个新目录。需要提供目录名和访问权限。
函数原型:
int mkdir(const char *pathname, mode_t mode);
pathname
:新目录的路径。mode
:目录权限,通常使用如0755
来设定权限。
返回值:
- 成功:返回0。
- 失败:返回-1,
errno
会设置相应的错误。
3.2 rmdir()
用于删除一个空目录。删除时,目录必须为空。
函数原型:
int rmdir(const char *path);
path
:需要删除的目录路径。
返回值:
- 成功:返回0。
- 失败:返回-1,
errno
会设置具体的错误原因(如目录非空)。
4. 获取目录中的文件列表
获取目录中的文件列表通常需要遍历目录。Linux提供了一些API来帮助我们打开、读取和关闭目录。
4.1 opendir() 打开目录
函数原型:
DIR *opendir(const char *pathname);
pathname
:需要打开的目录路径。
返回值:
- 成功:返回
DIR*
,即目录流。 - 失败:返回
NULL
,errno
设置为错误码。
4.2 readdir() 读取目录内容
函数原型:
struct dirent *readdir(DIR *dirp);
dirp
:通过opendir()
获得的目录流。
返回值:
- 成功:返回指向
dirent
结构体的指针,其中包含了当前目录项的信息。 - 失败:返回
NULL
。
4.3 closedir() 关闭目录
函数原型:
int closedir(DIR *dirp);
dirp
:需要关闭的目录流。
返回值:
- 成功:返回0。
- 失败:返回-1。
5. dirent 结构体
在通过readdir()
函数获取目录项时,返回的是一个dirent
结构体,该结构体定义了目录项的相关信息。
结构体定义:
struct dirent {long d_ino; // inode编号off_t d_off; // 偏移量unsigned short d_reclen; // 目录项长度unsigned char d_type; // 文件类型char d_name[NAME_MAX+1]; // 文件名
};
d_name
:存储目录项的文件名,最大长度为255字符。d_type
:文件类型,可能的值包括普通文件(DT_REG
)、目录(DT_DIR
)、符号链接(DT_LNK
)等。
6. 示例代码
(1) 获取当前工作目录
以下示例展示了如何使用getcwd()
和get_current_dir_name()
获取当前工作目录:
#include <iostream>
#include <unistd.h>
#include <stdlib.h>using namespace std;int main() {// 使用getcwd()获取当前工作目录char path1[256];if (getcwd(path1, sizeof(path1)) != NULL) {cout << "Current working directory (getcwd): " << path1 << endl;} else {perror("getcwd failed");}// 使用get_current_dir_name()获取当前工作目录char *path2 = get_current_dir_name();if (path2 != NULL) {cout << "Current working directory (get_current_dir_name): " << path2 << endl;free(path2); // 注意释放内存} else {perror("get_current_dir_name failed");}return 0;
}
(2)切换工作目录
示例展示了如何使用chdir()
函数来切换工作目录:
#include <iostream>
#include <unistd.h>
#include <stdlib.h>using namespace std;int main() {// 获取当前工作目录char currentDir[256];if (getcwd(currentDir, sizeof(currentDir)) != NULL) {cout << "Current working directory: " << currentDir << endl;} else {perror("getcwd failed");return 1;}// 切换到新的目录if (chdir("/home") == 0) {cout << "Changed working directory to /home" << endl;} else {perror("chdir failed");return 1;}// 获取切换后的工作目录if (getcwd(currentDir, sizeof(currentDir)) != NULL) {cout << "New working directory: " << currentDir << endl;} else {perror("getcwd failed");}return 0;
}
(3)创建和删除目录
以下示例展示了如何使用mkdir()
创建目录和rmdir()
删除空目录:
#include <iostream>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <stdlib.h>using namespace std;int main() {const char *dirName = "testDir";// 创建目录if (mkdir(dirName, 0755) == 0) {cout << "Directory " << dirName << " created successfully." << endl;} else {perror("mkdir failed");return 1;}// 删除目录if (rmdir(dirName) == 0) {cout << "Directory " << dirName << " deleted successfully." << endl;} else {perror("rmdir failed");return 1;}return 0;
}
(4)遍历目录中的文件
以下示例展示了如何使用opendir()
, readdir()
, 和 closedir()
来遍历目录中的文件:
#include <iostream>
#include <dirent.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>using namespace std;int main() {const char *dirName = "/home";// 打开目录DIR *dir = opendir(dirName);if (dir == NULL) {perror("opendir failed");return 1;}struct dirent *entry;// 遍历目录中的文件cout << "Files in directory " << dirName << ":" << endl;while ((entry = readdir(dir)) != NULL) {cout << "File: " << entry->d_name << endl;}// 关闭目录closedir(dir);return 0;
}
(5)结合所有操作的示例
以下是一个较为完整的示例,结合了获取当前目录、切换目录、创建目录和遍历目录等操作:
#include <iostream>
#include <unistd.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <stdlib.h>using namespace std;int main() {char currentDir[256];// 获取当前工作目录if (getcwd(currentDir, sizeof(currentDir)) != NULL) {cout << "Current working directory: " << currentDir << endl;} else {perror("getcwd failed");return 1;}// 创建目录const char *dirName = "exampleDir";if (mkdir(dirName, 0755) == 0) {cout << "Directory " << dirName << " created successfully." << endl;} else {perror("mkdir failed");return 1;}// 切换到新创建的目录if (chdir(dirName) == 0) {cout << "Changed to directory " << dirName << endl;} else {perror("chdir failed");return 1;}// 获取切换后的工作目录if (getcwd(currentDir, sizeof(currentDir)) != NULL) {cout << "New working directory: " << currentDir << endl;} else {perror("getcwd failed");}// 列出当前目录中的文件DIR *dir = opendir(".");if (dir == NULL) {perror("opendir failed");return 1;}struct dirent *entry;cout << "Files in the current directory:" << endl;while ((entry = readdir(dir)) != NULL) {cout << "File: " << entry->d_name << endl;}// 关闭目录closedir(dir);// 删除目录if (rmdir(dirName) == 0) {cout << "Directory " << dirName << " deleted successfully." << endl;} else {perror("rmdir failed");return 1;}return 0;
}
相关文章:
Linux 目录操作详解
Linux目录操作详解 1. 获取当前工作目录1.1 getcwd()1.2 get_current_dir_name() 2. 切换工作目录2.1 chdir() 3. 创建和删除目录3.1 mkdir()3.2 rmdir() 4. 获取目录中的文件列表4.1 opendir() 打开目录4.2 readdir() 读取目录内容4.3 closedir() 关闭目录 5. dirent 结构体6.…...
Elasticsearch的经典面试题及详细解答
以下是一些Elasticsearch的经典面试题及详细解答: 一、基础概念与原理 什么是Elasticsearch? 回答: Elasticsearch是一个基于Lucene的分布式搜索引擎,提供了RESTful API,支持多租户能力。它能够快速、近实时地存储、搜…...

Linux-arm(1)ATF启动流程
Linux-arm(1)ATF启动流量 Author:Once Day Date:2025年1月22日 漫漫长路有人对你微笑过嘛… 全系列文章可查看专栏: Linux实践记录_Once_day的博客-CSDN博客 参考文档: ARM Trusted Firmware分析——启动、PSCI、OP-TEE接口 Arnold Lu 博…...
C#编程:List.ForEach与foreach循环的深度对比
在C#中,List<T>.ForEach 方法和传统的 foreach 循环都用于遍历列表中的元素并对每个元素执行操作,但它们之间有一些关键的区别。 List<T>.ForEach 方法 方法签名:public void ForEach(Action<T> action)类型:…...

C语言文件操作:标准库与系统调用实践
目录 1、C语言标准库文件操作 1.1.题目要求: 1.2.函数讲解: fopen 函数原型 参数 常用的打开模式 返回值 fwrite函数 函数原型 参数 返回值 注意事项 fseek函数 函数原型 参数 返回值 fread函数 函数原型 参数 返回值 fclose 函数…...
代码随想录 栈与队列 test 7
347. 前 K 个高频元素 - 力扣(LeetCode) 首先想到哈希,用key来存元素,value来存出现次数,最后进行排序,时间复杂度约为o(nlogn)。由于只需求前k个,因此可以进行优化,利用堆来维护这…...

C语言练习(21)
有一行电文,已按下面规律译成密码: A→Za→Z B→Yb→y C→Xc→X 即第1个字母变成第26个字母,第2个字母变成第25个字母,第i个字母变成第(26-i十1)个字母。非字母字符不变。假如已知道密码是Umtorhs&…...

智能手机“混战”2025:谁将倒下而谁又将突围?
【潮汐商业评论原创】 “去年做手机比较艰难,几乎每个品牌都在调价、压货,像华为这种以前都不给我们分货的厂商,也开始成为我的主要库存。不过今年开头比较好,20号国补一开始,店里的人流和手机销量就明显涨了不少&…...

计算机图形学:实验一 OpenGL基本绘制
1.OpenGL的环境配置: 集成开发环境Visual Studio Community 2019的安装: 在Windows一栏选择使用C的桌面开发;再转到“单个组件”界面,在“编译器、生成工具和运行时”一栏选择用于“Windows的C CMake工具”;然后转到…...
二分查找题目:快照数组
文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题:快照数组 出处:1146. 快照数组 难度 7 级 题目描述 要求 实现支持下列接口的快照数组: SnapshotArray(int length) \textt…...

深度学习|表示学习|卷积神经网络|参数共享是什么?|07
如是我闻: Parameter Sharing(参数共享)是卷积神经网络(CNN)的一个重要特性,帮助它高效地处理数据。参数共享的本质就是参数“本来也没有变过”。换句话说,在卷积层中,卷积核的参数&…...

基于相机内参推导的透视投影矩阵
基于相机内参推导透视投影矩阵(splatam): M c a m [ 2 ⋅ f x w 0.0 ( w − 2 ⋅ c x ) w 0.0 0.0 2 ⋅ f y h ( h − 2 ⋅ c y ) h 0.0 0 0 f a r n e a r n e a r − f a r 2 f a r ⋅ n e a r n e a r − f a r 0.0 0.0 − 1.0 0.0 ] M_…...
浅析Dubbo 原理:架构、通信与调用流程
一、Dubbo 简介 Dubbo 是阿里巴巴开源的高性能、轻量级的 Java RPC(Remote Procedure Call,远程过程调用)框架,旨在实现不同服务之间的远程通信和调用。在分布式系统中,不同服务可能部署在不同的服务器上,D…...

03垃圾回收篇(D3_垃圾收集器的选择及相关参数)
目录 学习前言 一、收集器的选择 二、GC日志参数 三、垃圾收集相关的常用参数 四、内存分配与回收策略 1. 对象优先在Eden分配 2. 大对象直接进入老年代 3. 长期存活的对象将进入老年代 4. 动态对象年龄判定 5. 空间分配担保 学习前言 本章主要学习垃圾收集器的选择及…...

一、引论,《组合数学(第4版)》卢开澄 卢华明
零、前言 发现自己数数题做的很烂,重新学一遍组合数学吧。 参考卢开澄 卢华明 编著的《组合数学(第4版)》,只打算学前四章。 通过几个经典问题来了解组合数学所研究的内容。 一、幻方问题 据说大禹治水之前,河里冒出来一只乌龟,…...

Vue3+TS 实现批量拖拽文件夹上传图片组件封装
1、html 代码: 代码中的表格引入了 vxe-table 插件 <Tag /> 是自己封装的说明组件 表格列表这块我使用了插槽来增加扩展性,可根据自己需求,在组件外部做调整 <template><div class"dragUpload"><el-dialo…...
二叉树的所有路径(力扣257)
因为题目要求路径是从上到下的,所以最好采用前序遍历。这样可以保证按从上到下的顺序将节点的值存入一个路径数组中。另外,此题还有一个难点就是如何求得所有路径。为了解决这个问题,我们需要用到回溯。回溯和递归不分家,每递归一…...
Python OrderedDict 实现 Least Recently used(LRU)缓存
OrderedDict 实现 Least Recently used(LRU)缓存 引言正文 引言 LRU 缓存是一种缓存替换策略,当缓存空间不足时,会移除最久未使用的数据以腾出空间存放新的数据。LRU 缓存的特点: 有限容量:缓存拥有固定的…...

LabVIEW项目中的工控机与普通电脑选择
工控机(Industrial PC)与普通电脑在硬件设计、性能要求、稳定性、环境适应性等方面存在显著差异。了解这些区别对于在LabVIEW项目中选择合适的硬件至关重要。下面将详细分析这两种设备的主要差异,并为LabVIEW项目中的选择提供指导。 硬件设…...

Ansys Speos | Speos Meshing 网格最佳实践
概述 网格划分是在各种计算应用中处理3D几何的基本步骤: 表面和体积:网格允许通过将复杂的表面和体积分解成更简单的几何元素(如三角形、四边形、四面体或六面体)来表示复杂的表面和体积。 模拟和渲染:网格是创建离散…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...

UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...

C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...

数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...
【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解
一、前言 在HarmonyOS 5的应用开发模型中,featureAbility是旧版FA模型(Feature Ability)的用法,Stage模型已采用全新的应用架构,推荐使用组件化的上下文获取方式,而非依赖featureAbility。 FA大概是API7之…...