4.20 mkdir和rmdir函数-目录的创建与删除

一、mkdir函数

mkdir函数用于创建一个新目录,函数原型:

#include <sys/stat.h>
int mkdir(const char *pathname, mode_t mode);

返回值:若创建成功则返回0,若出错则返回-1

参数:

pathname 要创建的新目录的路径

mode 文件创建模式字。(参考《4.5 文件访问权限》、《4.6 新文件和新目录的所有权》和《4.8 umask函数与文件模式创建屏蔽字》)

为什么可以把目录(windows下称为文件夹)看作文件呢?


上图是ext3文件系统大致结构,这样去理解:

(1)先把磁盘分区按一定尺度(例如512字节)划分成若干数据块,以块为单位给文件分配空间,每个数据块分配一个编号;

(2)拿出若干块出来记录每个文件分配了那些数据块,每个记录称为i节点,每个i节点分配一个编号,一个节点代表一个文件(包括目录文件)。上图i节点分配如下:

节点编号节点类型分配的数据块编号
0普通文件1,3
1目录文件2
2未分配未分配
3目录文件5
对于普通文件,储存什么,储存格式是什么,完全由应用程序决定;

对于目录文件(上图红色部分),储存的数据是固定格式的目录项,这些目录项构成了一个目录的目录表。每个目录项记录本目录下一个文件的文件指针(i节点编号)和文件名,这里的文件可以是一个普通文件,也可以是一个目录文件(子目录)。

每个目录文件的目录表至少包括两个目录项,一个指向本目录的i节点,文件名是“.”,另一个指向父目录的节点,文件名“..”。只有这两个目录项的目录称为空目录。

上图显示了两个目录的目录表,先从下面的目录表开始分析,其中下面那个目录表中记录了一个文件名为mydir的目录项,根据其i节点编号(编号为3)查i节点表,发现它是一个目录文件,该i节点分配的数据块是编号为5的数据块,取数据块5的数据,继续分析其目录表,发现它包含了一个文件名为myfile的文件,文件指针是i节点0,查i节点0信息,发现它是一个普通文件,分配了数据块1和数据块3。

查找一个目录的父目录更简单,从本目录的目录表中找出文件名为“..”的目录项,查其文件指针即可。

从文件的查找和数据储存来看,查找一个文件和一个目录是完全一致的。目录文件的数据表相当于普通文件的数据。

严格讲,完全可以用普通文件的open函数打开一个目录文件,然后用write函数向目录的数据块写入目录项,实现新文件的创建或者新目录。也就是说文件系统只需要提供四个系统调用open、write、read和close就足够实现所有文件的操作了。然而这种做是不合适的,一是所有人都必须对各种文件系统的原理和现非常了解,二是文件系统会处于非常危险混乱状态。所以说,大部分文件管理系统都提供很多具体的文件操作功能,本章主要是文件管理属性方面的文件管理函数。

mkdir函数相当普通文件的creat函数和link函数,rmdir函数相当于普通文件的unlink函数,opendir函数相当于普通文件的open函数,readdir函数相当于普通文件的read函数,closedir函数相当于普通文件的close函数。

实例 x.4.20.1.c

#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main(void)
{
    char     pathname[] = "/tmp/mydir";
    mode_t   mode = S_IRWXU | S_IRWXG;
    if(mkdir(pathname, mode) == -1) {
        printf("mkdir error for %s\n", pathname);
        return 1;
    } else {
        printf("mkdir succeed for %s\n", pathname);
    }
    return 0;
}

编译与执行:

[root@localhost unixc]# rm -rf /tmp/mydir
[root@localhost unixc]# ls -l /tmp/mydir
ls: cannot access /tmp/mydir: No such file or directory
[root@localhost unixc]# cc x.4.20.1.c
[root@localhost unixc]# ./a.out
mkdir succeed for /tmp/mydir
[root@localhost unixc]# ls -l /tmp/mydir
total 0
[root@localhost unixc]#

二、rmdir函数

rmdir函数用于删除一个空目录。函数原型:

#include <unistd.h>
int rmdir(const char *pathname);

返回值:如果删除成功则返回0,如果出错则返回-1

参数:

pathname 要删除的目录路径

实例 x.4.20.2.c

#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main(void)
{
    char     pathname[] = "/tmp/mydir";
    mode_t   mode = S_IRWXU | S_IRWXG;
    if(rmdir(pathname) == -1) {
        printf("rmdir error for %s\n", pathname);
        return 1;
    } else {
        printf("rmdir succeed for %s\n", pathname);
    }
    return 0;
}


编译与执行:

calhost unixc]# rm -rf /tmp/mydir

[root@localhost unixc]# mkdir /tmp/mydir
[root@localhost unixc]# ls -l /tmp/mydir
total 0
[root@localhost unixc]# cc x.4.20.2.c
[root@localhost unixc]# ./a.out
rmdir succeed for /tmp/mydir
[root@localhost unixc]# ls -l /tmp/mydir
ls: cannot access /tmp/mydir: No such file or directory
[root@localhost unixc]#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值