• 创建和删除目录( mkdir函数 和 rmdir函数 )



    前言

    目录(文件夹)在 Linux 系统也是一种文件,是一种特殊文件,同样可以使用前面给大家介绍 open、read 等这些系统调用以及 C 库函数对其进行操作,但是目录作为一种特殊文件,并不适合使用前面介绍的文件 I/O 方式进行读写等操作。在 Linux 系统下,会有一些专门的系统调用或 C 库函数用于对文件夹进行操作,譬如:打开、创建文件夹、删除文件夹、读取文件夹以及遍历文件夹中的文件等,那么本小节将介绍目录相关的知识内容。

    一、目录存储形式

    前面有给大家介绍了普通文件的管理形式或存储形式,本节介绍目录这种特殊文件在文件系统中的存储形式,其实目录在文件系统中的存储方式与常规文件类似,常规文件包括了 inode 节点以及文件内容数据存储块(block);但对于目录来说,其存储形式则是由 inode 节点和目录块所构成,目录块当中记录了有哪些文件组织在这个目录下,记录它们的文件名以及对应的 inode 编号。其存储形式如下图所示:
    在这里插入图片描述

    目录块当中有多个目录项(或叫目录条目),每一个目录项(或目录条目)都会对应到该目录下的某一个文件,目录项当中记录了该文件的文件名以及它的 inode 节点编号,所以通过目录的目录块便可以遍历找到该目录下的所有文件以及所对应的 inode 节点。

    所以对此总结如下:
    ⚫ 普通文件由 inode 节点和数据块构成
    ⚫ 目录由 inode 节点和目录块构成

    二、创建和删除目录

    使用 open 函数可以创建一个普通文件,但不能用于创建目录文件,在 Linux 系统下,提供了专门用于创建目录 mkdir()以及删除目录 rmdir 相关的系统调用。

    mkdir 函数

    函数原型如下所示:

    #include 
    #include 
    int mkdir(const char *pathname, mode_t mode);
    
    • 1
    • 2
    • 3

    函数参数和返回值含义如下:
    pathname:需要创建的目录路径。
    mode:新建目录的权限设置,设置方式与 open 函数的 mode 参数一样,最终权限为(mode & ~umask)。
    返回值:成功返回 0;失败将返回-1,并会设置 errno。

    pathname 参数指定的新建目录的路径,该路径名可以是相对路径,也可以是绝对路径,若指定的路径名已经存在,则调用 mkdir()将会失败。
    mode 参数指定了新目录的权限,目录拥有与普通文件相同的权限位,但是其表示的含义与普通文件却有不同。

    mkdir() 使用示例

    #include 
    #include 
    #include 
    #include 
    
    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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    上述代码中,通过 mkdir 函数在当前目录下创建了一个目录 new_dir,并将其权限设置为 0755(八进制)。

    rmdir 函数

    rmdir()用于删除一个目录

    #include 
    int rmdir(const char *pathname);
    
    • 1
    • 2

    首先,使用该函数需要包含头文件
    函数参数和返回值含义如下:
    pathname:需要删除的目录对应的路径名,并且该目录必须是一个空目录,也就是该目录下只有.和…这两个目录项;pathname 指定的路径名不能是软链接文件,即使该链接文件指向了一个空目录。
    返回值:成功返回 0;失败将返回-1,并会设置 errno。

    rmdir() 使用示例

    #include 
    #include 
    #include 
    
    int main(void) 
    {
    	 int ret;
    	 ret = rmdir("./new_dir");
    	 if (-1 == ret) 
    	 {
    		 perror("rmdir error");
    		 exit(-1);
    	 }
    	 exit(0);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  • 相关阅读:
    【mindspore1.5.0】安装mindspore报libcuda.so没找到和libcudnn没找到
    工业检测中物距、像距和焦距的关系&&相机视野的计算方法
    <C++>详解list类
    送给python初学者的福利!掌握了这些知识,你将超过80%的小白
    数据结构与算法-(7)---栈的应用-(3)表达式转换
    【MYSQL】 三大范式 表的关系 外键 ER图
    【C++】STL:string类
    Mysql索引分类及其使用实例
    计算机网络八股
    Go sync.waitGroup
  • 原文地址:https://blog.csdn.net/Dustinthewine/article/details/126694146