河源抖音seo讯息,百度快速优化排名软件,设计展板排版样式,新思域设计公司网站建设目录 前言 01 mkdir 系统调用
mkdir的代码示例 02 rmdir删除目录
03 打开、读取以及关闭目录
3.1 opendir()函数原型#xff1a;
04 读取目录 readdir()
05 struct dirent 结构体#xff1a;
06 rewinddir ()函数重置目录流
07 关闭目录 closedir ()函数
测试:打印…目录 前言 01 mkdir 系统调用
mkdir的代码示例 02 rmdir删除目录
03 打开、读取以及关闭目录
3.1 opendir()函数原型
04 读取目录 readdir()
05 struct dirent 结构体
06 rewinddir ()函数重置目录流
07 关闭目录 closedir ()函数
测试:打印目录下的文件名与iNode
08 getcwd() 函数当前工作目录
09 改变当前工作目录chdir()和 fchdir() 10 remove 函数删除文件 前言 个人主页ChenPi 推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ 推荐专栏2: 《Linux C应用编程概念类_ChenPi的博客-CSDN博客》✨✨✨ 推荐专栏3: 《 链表_ChenPi的博客-CSDN博客 》 ✨✨✨ 本篇简介 : 在上两章中我们Linux的文件系统底下的目录结构 这一章我们学习目录文件 目录块当中有多个目录项或叫目录条目
每一个目录项或目录条目都会对应到该目录下的某一 个文件
目录项当中记录了该文件的文件名以及它的 inode 节点编号
所以通过目录的目录块便可以遍历找 到该目录下的所有文件以及所对应的 inode 节点。 01 mkdir 系统调用
mkdir()函数原型
#include sys/stat.h
#include sys/types.h int mkdir(const char *pathname, mode_t mode);
函数参数和返回值含义如下 pathname需要创建的目录路径。mode新建目录的权限设置设置方式与 open 函数的 mode 参数一样最终权限为mode ~umask。与清0或置1返回值成功返回 0失败将返回-1并会设置 errno。 pathname 参数指定的新建目录的路径该路径名可以是相对路径也可以是绝对路径
若指定的路径 名已经存在则调用 mkdir()将会失败。 mode 参数指定了新目录的权限
目录拥有与普通文件相同的权限位但是其表示的含义与普通文件却 有不同
mkdir的代码示例
#include stdio.h
#include sys/stat.h
#include sys/types.h
#include stdlib.hint main()
{int ret mkdir(./next,0777);if(-1 ret){perror(mkdir error :);exit(-1);}return 0;
}
当执行完./a.out时在当前目录下生成一个next目录文件 02 rmdir删除目录
rmdir 函数函数原型首先使用该函数需要包含头文件。
#include unistd.h
int rmdir(const char *pathname);
函数参数和返回值含义如下
pathname需要删除的目录对应的路径名并且该目录必须是一个空目录也就是该目录下只有.和..这 两个目录项pathname 指定的路径名不能是软链接文件即使该链接文件指向了一个空目录。 返回值成功返回 0失败将返回-1并会设置 errno。 2.2rmdir 函数测试
#include unistd.h
#include stdlib.h
#include stdio.h
#define MY_FILE ./nextvoid main()
{int ret rmdir(MY_FILE);if(-1 ret){perror();exit(-1);}
}
代码执行完后刚才创建的next文件被删除
03 打开、读取以及关闭目录 打开、读取、关闭一个普通文件可以使用 open()、read()、close()
而对于目录来说可以使用 opendir()、readdir()和 closedir()来打开、读取以及关闭目录。
3.1 opendir()函数原型 opendir()函数用于打开一个目录并返回指向该目录的句柄供后续操作使用。Opendir 是一个 C 库函数。
#include sys/types.h
#include dirent.h DIR *opendir(const char *name);
函数参数和返回值含义如下 name指定需要打开的目录路径名可以是绝对路径也可以是相对路径。返回值成功将返回指向该目录的句柄一个 DIR 指针其实质是一个结构体指针其作用类似于open函数返回的文件描述符fd后续对该目录的操作需要使用该DIR指针变量若调用失败则返回NULL。 04 读取目录 readdir()
readdir()用于读取目录获取目录下所有文件的名称以及对应 inode 号。
readdir()是 一个 C 库函数事实上 Linux 系统还提供了一个 readdir 系统调用
其函数原型如下所示
#include dirent.h struct dirent *readdir(DIR *dirp);
函数参数和返回值含义如下 dirp目录句柄 DIR 指针。返回值返回一个指向 struct dirent 结构体的指针该结构体表示 dirp 指向的目录流中的下一个目录条目。在到达目录流的末尾或发生错误时它返回 NULL。 Tips“流”是从自然界中抽象出来的一种概念有点类似于自然界当中的水流
在文件操作中文件 内容数据类似池塘中存储的水
N 个字节数据被读取出来或将 N 个字节数据写入到文件中这些数据就构 成了字节流。 “流”这个概念是动态的而不是静态的。编程当中提到这个概念一般都是与 I/O 相关所以也经 常叫做 I/O 流但对于目录这种特殊文件来说这里将目录块中存储的数据称为目录流存储了一个一个 的目录项目录条目。 05 struct dirent 结构体
struct dirent { ino_t d_ino; /* inode 编号 */ off_t d_off; /* not an offset; see NOTES */ unsigned short d_reclen; /* length of this record */ unsigned char d_type; /* type of file; not supported by all filesystem types */ char d_name[256]; /* 文件名 */
}; 对于 struct dirent 结构体
我们只需要关注 d_ino 和 d_name 两个字段即可
分别记录了文件的 inode 编 号和文件名
每调用一次 readdir()就会从 drip 所指向的目录流中读取下一条目录项目录条目
并返回 struct dirent结构体指针指向经静态分配而得的 struct dirent 类型结构
每次调用 readdir()都会覆盖该结构。一旦遇到 目录结尾或是出错readdir()将返回 NULL
针对后一种情况还会设置 errno 以示具体错误。
那如何区别究 竟是到了目录末尾还是出错了呢可通过如下代码进行判断
#include errno.h error 0; direntp readdir(dirp); if (NULL direntp) { if (0 ! error) { /* 出现了错误 */ } else { /* 已经到了目录末尾 */ } } 这段代码很好理解观察上面一段伪代码error变量来自于errno头文件
将error变量设置为0readdir返回空指针时证明函数执行出错
那究竟是目录末尾还是出错了呢如果0error的话
那就证明erro值被内核设置了证明出错了
06 rewinddir ()函数重置目录流
rewinddir()是 C 库函数可将目录流重置为目录起点
以便对 readdir()的下一次调用将从目录列表中的 第一个文件开始。
rewinddir 函数原型如下所示
#include sys/types.h
#include dirent.h void rewinddir(DIR *dirp); 函数参数和返回值含义如下 dirp目录句柄。返回值无返回值。 07 关闭目录 closedir ()函数 closedir()函数用于关闭处于打开状态的目录同时释放它所使用的资源其函数原型如下所示
函数参数和返回值含义如下
#include sys/types.h
#include dirent.h int closedir(DIR *dirp); dirp目录句柄。返回值成功返回 0失败将返回-1并设置 errno。 测试:打印目录下的文件名与iNode
1. 打开一个目录、并将目录下的所有文件的名称 以及其对应 inode 编号打印出来。
示例代码如下所示
#include unistd.h
#include stdlib.h
#include stdio.h
#include sys/types.h
#include dirent.h
#include sys/stat.h
#include errno.h
#include sys/types.h
#include sys/stat.h
#include fcntl.h#define MY_FILE ./nextvoid main()
{//1创建目录/*int ret mkdir(MY_FILE,0777);if(-1 ret){perror();exit(-1);}
*///2打开目录文件DIR *fdir;fdir opendir(MY_FILE);if(NULL fdir){perror(opendir);}int fd1 open(./next/test.c, O_RDWR|O_CREAT, 0777);if(-1 fd1){perror();}//3目录文件里面的文件以及inode编号errno 0;struct dirent *ret1 ; while(NULL ! ( ret1 readdir(fdir))){printf(inode:%ld name:%s \n,ret1-d_ino,ret1-d_name);}if(NULL ret1){if (errno ! 0){puts(读取目录文件出错\n);}else{puts(readdir succeed\n);}}//4关闭目录文件closedir(fdir);
}
由此可知示例代码 能够将next目录下的所有文件全部扫描出来打印出它们的名字以及 inode节点。
08 getcwd() 函数当前工作目录
来获取进程的当前工作目录
如下所示
#include unistd.h char *getcwd(char *buf, size_t size);函数参数和返回值含义如下 bufgetcwd()将内含当前工作目录绝对路径的字符串存放在 buf 缓冲区中。size缓冲区的大小分配的缓冲区大小必须要大于字符串长度否则调用将会失败。返回值如果调用成功将返回指向 buf 的指针失败将返回 NULL并设置 errno。 Tips若传入的 buf 为 NULL且 size 为 0则 getcwd()内部会按需分配一个缓冲区并将指向该缓冲区 的指针作为函数的返回值为了避免内存泄漏调用者使用完之后必须调用 free()来释放这一缓冲区所占内 存空间。
#include stdio.h
#include unistd.h
#include stdlib.hvoid main()
{char *str getcwd(NULL,0);printf(%s ,str);free(str);
}
09 改变当前工作目录chdir()和 fchdir()
系统调用 chdir()和 fchdir()可以用于更改进程的当前工作目录
chdir()和 fchdir()函数原型
#include unistd.h int chdir(const char *path);
int fchdir(int fd);
函数参数和返回值含义如下 path将进程的当前工作目录更改为 path 参数指定的目录可以是绝对路径、也可以是相对路径指定的目录必须要存在否则会报错。fd将进程的当前工作目录更改为 fd 文件描述符所指定的目录譬如使用 open 函数打开一个目录。返回值成功均返回 0失败均返回-1并设置 errno。 此两函数的区别在于指定目录的方式不同
chdir()是以路径的方式进行指定
而 fchdir()则是通过文件 描述符文件描述符可调用 open()打开相应的目录时获得。
6.2 代码测试
#include stdio.h
#include unistd.h
#include stdlib.hvoid main()
{char *str NULL ;str getcwd(NULL,0);printf(%s\n ,str);free(str);/* 更改进程的当前工作目录 */ int ret chdir(/home/chen/); if (-1 ret) { perror(chdir error); exit(-1); } str getcwd(NULL,0);printf(%s\n ,str);free(str);
} 10 remove 函数删除文件
remove()是一个 C 库函数用于移除一个文件或空目录其函数原型如下所示
函数原型
#include stdio.h int remove(const char *pathname);
使用该函数需要包含 C 库函数头文件。
函数参数和返回值含义如下 pathname需要删除的文件或目录路径可以是相对路径、也可是决定路径。返回值成功返回 0失败将返回-1并设置 errno。 pathname 参数指定的是一个非目录文件那么 remove()去调用 unlink()
如果 pathname 参数指定的是 一个目录那么 remove()去调用 rmdir()。 与 unlink()、rmdir()一样remove()不对软链接进行解引用操作
若 pathname 参数指定的是一个软链接 文件
则 remove()会删除链接文件本身、而非所指向的文件。