Linux之管理目录

本文详细介绍了Linux中管理目录的相关函数,包括getcwd、mkdir、rmdir、chdir、opendir、closedir和readdir。通过man手册学习这些函数的用法,并提供函数例程及运行结果,帮助读者深入理解目录操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux之管理目录

一、目录以及基础知识

在 linux 中,文件目录包含文件名列表,每一个文件名对应一个 inode 编号。
目录中还能包含其它子目录,在 linux 中所有的目录和文件都是以树形结构组织的。
既然是树形结构,那么肯定就有一个根,在 linux 下有一个根 root 目录,使用命令“cd /”就可以进入 root 目录。
注意:root 目录指的是根目录。另外有一个 root 用户的概念,一个是目录中的概念,一个是 linux用户中的概念,不要混淆。
在接下来的小节中会学习到当前工作目录,创建目录,删除目录,读取目录内容等。

二、getcwd 函数

1、使用 man 学习 getcwd 函数

如下图所示,使用命令“man 3 getcwd”。有三个类似的函数 getcwd,getwd,get_current_dir_name。
在这里插入图片描述
接着介绍一下 getcwd 和 get_current_dir_name 的用法。
注意:getwd函数已经过时,使用的时候会有警告。

char *getcwd(char *buf, size_t size);
//参数*buf:保存当前目录的缓冲区。
//参数 size:在现代 linux 中,buf 的长度至少可以为 255 字节。
//返回值:成功返回指向当前目录的指针,和 buf 的值一样,错误返回 NULL。
char *get_current_dir_name(void);
//参数:无
//返回值:成功返回指向当前目录的指针,错误返回 NULL。

关于get_current_dir_name函数,给大家再介绍一点额外的知识。
打开头文件“/usr/include/unistd.h”,找到函数定义。如下图所示。
在这里插入图片描述
如上图所示,必须定义“__USE_GNU”才能使用get_current_dir_name 函数。另外经过测试发现,getwd 函数,无论定义不定义条件,都会警告这个函数已经过时,虽然可以使用。

2、函数例程

编写简单的 getcwd.c 文件测试 getcwd 函数。

#include <stdio.h>
/*getcwd、getwd和get_current_dir_name
函数的头文件*/
#define __USE_GNU
#include <unistd.h>

#define LENTH 255
int main()
{
	char pwd[LENTH];
	char *wd;
//getcwd函数测试		
	if(!getcwd(pwd,LENTH)){
		perror("getcwd");
		return 1;
	}
	printf("\ngetcwd pwd is %s\n",pwd);
	
//getwd函数测试
	wd = getwd(pwd);
	if(!wd){
		perror("getcwd");
		return 1;
	}
	printf("\ngetwd pwd is %s\n",wd);
	
//get_current_dir_name函数测试	
	wd = get_current_dir_name();
	if(!wd){
		perror("getcwd");
		return 1;
	}
	printf("\nget_current pwd is %s\n",wd);
	
	return 0;
}

3、运行结果

在这里插入图片描述
如上图所示,由于作者运行程序的当前目录是 linux 的“/”,所示显示是“/”。大家可以在其它目录下运行,看一下效果。

三、mkdir 函数

1、 使用 man 学习 mkdir 函数

如下图所示,使用命令“man 2 mkdir”,并回车。
在这里插入图片描述
接着介绍一下 mkdir 的用法。

int mkdir(const char *pathname, mode_t mode);
//参数:文件路径
//参数 mode:直接使用数字即可。和前面命令中 chmod 777 xxx 中的 777 这个参数含义类似,也可以使用文档中的组合值。
//返回值:成功返回 0,错误返回-1

2、函数例程

编写简单的 mkdir.c 文件测试 mkdir 函数。

#include <stdio.h>
//mkdir函数头文件
#include <sys/stat.h>
#include <sys/types.h>

int main(int argc,char *argv[])
{
	int ret;
		
//检测参数	
	if(argc <2){
		printf("\nPlease input file path\n");
		return 1;
	}
//使用mkdir函数新建目录
	ret = mkdir(argv[1],0777);
	if(ret<0){
		printf("mkdir %s failed!\n",argv[1]);
		return 1;
	}
	printf("mkdir %s suceces!\n",argv[1]);
	
	return 0;
}

3、运行结果

在这里插入图片描述
如上图所示,接着使用 ls 命令查看,可以发现新建了一个 test 目录。

四、rmdir 函数

1、使用 man 学习 rmdir 函数

如下图所示,使用命令“man 2 rmdir”。
在这里插入图片描述
接着介绍一下 rmdir 的用法。

int rmdir(const char *pathname);
//参数*pathname:文件和目录的路径。
//返回值:成功返回 0,错误返回-1。

2、函数例程

编写简单的 rmdir.c 文件测试 rmdir 函数。

#include <stdio.h>
//rmdir函数头文件
#include <unistd.h>

int main(int argc,char *argv[])
{
	int ret;
		
//检测参数	
	if(argc <2){
		printf("\nPlease input file path\n");
		return 1;
	}
//使用rmdir函数删除目录
	ret = rmdir(argv[1]);
	if(ret<0){
		printf("rmdir %s failed!\n",argv[1]);
		return 1;
	}
	printf("rmdir %s suceces!\n",argv[1]);
	
	return 0;
}

3、运行结果

在这里插入图片描述
如上图所示,删除的是前面一个实验 mkdir 程序新建的 test 目录,如果再次使用 ls 命令查看,将会发现这个 test 目录被删除了。

五、chdir 函数

本节实验介绍如何使用代码改变当前工作目录
在实际应用中,代码可能需要从当前目录中进到其它目录,这个时候首先需要使用 getcwd函数获取当前目录,保存起来,然后使用 chdir 跳到其它目录,完成操作,然后再使用 chdir回到最初保存的目录。

1、使用 man 学习 chdir 函数

如下图所示,使用命令“man 2 chdir”。有两个类似的函数 chdir,fchdir。
在这里插入图片描述
接着介绍一下 chdir 和 fchdir 的用法。

int chdir(const char *path);
//参数 *path:文件路径
//返回值:成功返回 0,错误返回-1。
int fchdir(int fd);
//参数 fd:open 函数返回的句柄,文件描述符。
//返回值:成功返回 0,错误返回-1。

2、函数例程

编写简单的 chdir.c 文件测试 chdir 函数。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
//chdir和fchdir函数头文件
#include <unistd.h>

#define LENTH 255

int main(int argc,char *argv[])
{
	int ret;
	char pwd[LENTH];

//检测参数	
	if(argc <3){
		printf("\nPlease input file path\n");
		return 1;
	}
	
//getcwd函数获取当前目录		
	if(!getcwd(pwd,LENTH)){
		perror("getcwd");
		return 1;
	}
	printf("\ngetcwd pwd is %s\n",pwd);
	
//使用chdir函数转入其他目录
	ret = chdir(argv[1]);
	if(ret){
		printf("Please make sure file path\n");
		return 1;
	}
	printf("chdir %s is success!\n",argv[1]);
	
//转入其他目录,完成操作
//使用rmdir函数删除目录
	ret = rmdir(argv[2]);
	if(ret<0){
		printf("rmdir %s failed!\n",argv[2]);
		return 1;
	}
	printf("rmdir %s is success!\n",argv[2]);
	
//再次使用chdir回到pwd保存的目录
	ret = chdir(pwd);
	if(ret){
		printf("Please make sure file path\n");
		return 1;
	}
	printf("chdir %s is success!\n",pwd);

	return 0;
}

3、运行结果

运行程序前,使用使用命令“mkdir /mnt/test”在/mnt 目录下新建一个 test 目录,如下图所示,“/mnt”目录将作为一个参数传递给 chdir 程序,另一个参数“/mnt/test”也会传递过去,这个“/mnt/test”目录将会被删除。
在这里插入图片描述
运行程序如下图所示。
在这里插入图片描述
如上图所示,程序运行之后,再次使用 ls 命令查看,会发现“mnt”目录下的“test”已经被删除了。

六、opendir 和 closedir 函数

1、使用 man 学习 opendir 和 closedir 函数

如下图所示,使用命令“man 3 opendir”。有两个类似的函数 opendir 和 fdopendir,fdopendir 不是标准的函数,不建议使用,移植性不太好,这里也直接使用 opendir。
在这里插入图片描述
接着介绍一下 opendir、closedir 的用法。

DIR *opendir(const char *name);
//参数:目录的路径。
//返回值:成功返回指向目录流的指针,错误返回 NULL。
int closedir(DIR *dirp);
//参数:opendir 返回的 dir 指针。
//返回值:成功返回 0, 失败返回-1.

2、函数例程

编写简单的 opendir.c 文件测试 opendir 和 closedir 函数。

#include <stdio.h>
//opendir和closedir函数头文件
#include <dirent.h>
#include <sys/types.h>

int main(int argc,char *argv[])
{
	int ret;
	DIR *dir;
	
//检测参数	
	if(argc <2){
		printf("\nPlease input file path\n");
		return 1;
	}
//使用opendir函数打开目录
	dir = opendir(argv[1]);
	if(dir==NULL){
		printf("opendir %s failed!\n",argv[1]);
		return 1;
	}
	printf("opendir %s suceces!\n",argv[1]);
//使用closedir函数关闭目录
	closedir(dir);
	
	return 0;
}

3、运行结果

在这里插入图片描述
如上图所示,可以看到在程序中打开了目录“mnt”。

七、readdir 函数

1、使用 man 学习 readdir 函数

如下图所示,使用命令“man 3 readdir”。有 readdir 和 readdir_r 两个函数,这里只介绍 readdir。
在这里插入图片描述
看一下参数的结构体 dirent,如下图所示。
在这里插入图片描述
如上图所示,各个参数的解释还是很清楚明了的。

struct dirent *readdir(DIR *dirp);
//参数 dirp:opendir 函数打开目录后返回的文件指针。
//返回值:成功返回指向 dirp 的指针 dirent ,错误返回 NULL。

2、函数例程

编写简单的 readdir.c 文件测试 readdir 函数。

#include <stdio.h>
//opendir,closedir,readdir函数头文件
#include <dirent.h>
#include <sys/types.h>

int main(int argc,char *argv[])
{
	int ret;
	DIR *dir;
	struct dirent *catlog;
//检测参数	
	if(argc <2){
		printf("\nPlease input file path\n");
		return 1;
	}
//使用opendir函数打开目录
	dir = opendir(argv[1]);
	if(dir==NULL){
		printf("opendir %s failed!\n",argv[1]);
		return 1;
	}
	printf("opendir %s suceces!\n",argv[1]);
//使用readdir读取目录argv[1]
	catlog = readdir(dir);
	if(catlog == NULL){
		printf("readdir %s failed!\n",argv[1]);
		return 1;
	}
	printf("%s d_ino is %ld\n ",argv[1],catlog->d_ino);
//使用closedir函数关闭目录
	closedir(dir);
	
	return 0;
}

3、运行结果

在这里插入图片描述
如上图所示,这里只是读取了文件许多参数中的 d_ino,其它参数可以自己写小程序打印出来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值