文章目录
- 前言
- 一、目录存储形式
- 二、创建和删除目录
- mkdir 函数
- rmdir 函数
前言
目录(文件夹)在 Linux 系统也是一种文件,是一种特殊文件,同样可以使用前面给大家介绍 open、read 等这些系统调用以及 C 库函数对其进行操作,但是目录作为一种特殊文件,并不适合使用前面介绍的文件 I/O 方式进行读写等操作。在 Linux 系统下,会有一些专门的系统调用或 C 库函数用于对文件夹进行操作,譬如:打开、创建文件夹、删除文件夹、读取文件夹以及遍历文件夹中的文件等,那么本小节将介绍目录相关的知识内容。
一、目录存储形式
前面有给大家介绍了普通文件的管理形式或存储形式,本节介绍目录这种特殊文件在文件系统中的存储形式,其实目录在文件系统中的存储方式与常规文件类似,常规文件包括了 inode 节点以及文件内容数据存储块(block);但对于目录来说,其存储形式则是由 inode 节点和目录块所构成,目录块当中记录了有哪些文件组织在这个目录下,记录它们的文件名以及对应的 inode 编号。其存储形式如下图所示:
目录块当中有多个目录项(或叫目录条目),每一个目录项(或目录条目)都会对应到该目录下的某一个文件,目录项当中记录了该文件的文件名以及它的 inode 节点编号,所以通过目录的目录块便可以遍历找到该目录下的所有文件以及所对应的 inode 节点。
所以对此总结如下:
⚫ 普通文件由 inode 节点和数据块构成
⚫ 目录由 inode 节点和目录块构成
二、创建和删除目录
使用 open 函数可以创建一个普通文件,但不能用于创建目录文件,在 Linux 系统下,提供了专门用于创建目录 mkdir()以及删除目录 rmdir 相关的系统调用。
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,并会设置 errno。
pathname 参数指定的新建目录的路径,该路径名可以是相对路径,也可以是绝对路径,若指定的路径名已经存在,则调用 mkdir()将会失败。
mode 参数指定了新目录的权限,目录拥有与普通文件相同的权限位,但是其表示的含义与普通文件却有不同。
mkdir() 使用示例
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>int main(void)
{int ret;ret = mkdir("./new_dir", S_IRWXU | S_IRGRP | S_IXGRP |S_IROTH | S_IXOTH);if (-1 == ret) {perror("mkdir error");exit(-1);}exit(0);
}
上述代码中,通过 mkdir 函数在当前目录下创建了一个目录 new_dir,并将其权限设置为 0755(八进制)。
rmdir 函数
rmdir()用于删除一个目录
#include <unistd.h>
int rmdir(const char *pathname);
首先,使用该函数需要包含头文件<unistd.h>。
函数参数和返回值含义如下:
pathname:需要删除的目录对应的路径名,并且该目录必须是一个空目录,也就是该目录下只有.和…这两个目录项;pathname 指定的路径名不能是软链接文件,即使该链接文件指向了一个空目录。
返回值:成功返回 0;失败将返回-1,并会设置 errno。
rmdir() 使用示例
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main(void)
{int ret;ret = rmdir("./new_dir");if (-1 == ret) {perror("rmdir error");exit(-1);}exit(0);
}