希冀 操作系统 实验七 文件管理

目录

一、创建目录查看mkdir()函数,补全关键代码。

二、创建文件查看create()函数,补全关键代码。

三、写文件,读文件。查看read()函数,补全关键代码。

四、删除文件查看del()函数,补全关键代码。

五、删除目录。查看rm()函数,补全关键代码

六.写文件,write()函数,在文件中写数据。

七.思考题 

open()

close()


 注意:

修改read()和write()函数时需要修改2处地方(题目里面没给说明),

read()是2个print()   一个是child 一个是 next

write()是2个scanf() 也是一个是child 一个是 next

一、创建目录查看mkdir()函数,补全关键代码。

int mkdir()
{
    // 初始化一个节点,节点名为空字符串,类型为目录(1表示目录)
    temp = initnode(" ", 1);
    scanf("%s", temp->filename);
    // 如果当前节点(可能表示当前目录)没有子节点
    if (recent->child == NULL)
    {
        temp->parent = recent;
        temp->child = NULL;
        recent->child = temp;
        temp->prev = temp->next = NULL;
        printf("目录建立成功!\n");
    }
    else
    {
        ttemp = recent->child;
        // 如果第一个子节点的文件名与要创建的目录名相同且为目录类型
        if (strcmp(ttemp->filename, temp->filename) == 0 && ttemp->isdir == 1)
        {
            printf("目录已存在!\n");
            return 1;
        }
        // 遍历当前节点的子节点链表
        while (ttemp->next)
        {
            ttemp = ttemp->next;
            // 如果找到文件名相同且为目录类型的节点
            if (strcmp(ttemp->filename, temp->filename) == 0 && ttemp->isdir == 1)
            {
                printf("目录已存在!\n");
                return 1;
            }
        }
        // 将新节点添加到链表末尾
        ttemp->next = temp;
        // 新节点的父节点设为NULL(这里可能是个错误,应该设置为recent)
        temp->parent = NULL;
        temp->child = NULL;
        temp->prev = ttemp;
        temp->next = NULL;
        printf("目录建立成功!\n");
   }
    return 0;
}

二、创建文件查看create()函数,补全关键代码。

int create()
{
    // 初始化一个节点,节点名为空字符串,类型为文件(0表示文件)
    temp = initnode(" ", 0);
    scanf("%s", temp->filename);
    // 如果当前节点(可能表示当前目录)没有子节点
    if (recent->child == NULL)
    {
        temp->parent = recent;
        temp->child = NULL;
        recent->child = temp;
        temp->prev = temp->next = NULL;
        printf("文件创建成功!\n");
    }
    else
    {
        ttemp = recent->child;
        // 如果第一个子节点的文件名与要创建的文件相同且为文件类型
        if (strcmp(ttemp->filename, temp->filename) == 0 && ttemp->isdir == 0)
        {
            printf("文件已存在!\n");
            return 1;
        }
        // 遍历当前节点的子节点链表
        while (ttemp->next)
        {
            ttemp = ttemp->next;
            // 如果找到文件名相同且为文件类型的节点
            if (strcmp(ttemp->filename, temp->filename) == 0 && ttemp->isdir == 0)
            {
                printf("文件已存在!\n");
                return 1;
            }
        }
        // 将新节点添加到链表末尾
        ttemp->next = temp;
        // 新节点的父节点设为NULL(这里可能是个错误,应该设置为recent)
        temp->parent = NULL;
        temp->child = NULL;
        temp->prev = ttemp;
        temp->next = NULL;
        printf("文件建立成功!\n");
    }
    return 0;
}

三、写文件,读文件。查看read()函数,补全关键代码。

int read() {
    char filename[FILENAME_LENGTH];
    scanf("%s", filename);
    if (recent->child == NULL) {
        // 如果最近访问的节点的子节点为空,表示文件不存在
        printf("文件不存在!\n");
        return 1;
    }
    if (strcmp(recent->child->filename, filename) == 0) {
        // 如果最近访问的节点的子节点的文件名与要查找的文件名相同
        printf("%s\n", recent->child->content);
        return 0;
    } else {
        temp = recent->child;
        while (temp->next) {
            if (strcmp(temp->next->filename, filename) == 0) {
                // 如果下一个节点的文件名与要查找的文件名相同
                printf("%s\n", temp->next->content);
                return 0;
            }
            temp = temp->next;
        }
        printf("文件不存在!\n");
        return 1;
    }
}

四、删除文件查看del()函数,补全关键代码。

int del()
{
    char filename[FILENAME_LENGTH];
    scanf("%s", filename);
    // 动态分配一个文件节点结构的内存空间
    temp = (struct filenode *)malloc(sizeof(struct filenode));

    // 如果当前节点(可能表示当前目录)有子节点
    if (recent->child)
    {
        temp = recent->child;
        // 在链表中查找要删除的文件节点,要求文件名匹配且不是目录(isdir!= 0表示是目录)
        while (temp->next && (strcmp(temp->filename, filename)!= 0 || temp->isdir!= 0))
            temp = temp->next;
        // 如果没找到匹配的文件节点
        if (strcmp(temp->filename, filename)!= 0 || temp->isdir!= 0)
        {
            printf("不存在该文件!\n");
            return 0;
        }
    }
    else
    {
        printf("不存在该文件!\n");
        return 0;
    }

    if (temp->parent == NULL)
    {
        temp->prev->next = temp->next;
        if (temp->next)
        {
            temp->next->prev = temp->prev;
        }
        temp->prev = temp->next = NULL;
    }
    else
    {
        if (temp->next)
        {
            temp->next->parent = temp->parent;
        }
        temp->parent->child = temp->next;
    }
    free(temp);
    printf("文件已删除!\n");
    return 0;
}

五、删除目录。查看rm()函数,补全关键代码

int rm()
{
    char filename[FILENAME_LENGTH];
    scanf("%s", filename);
    temp = (struct filenode *)malloc(sizeof(struct filenode));

    // 如果当前节点(可能表示当前目录)有子节点
    if (recent->child)
    {
        temp = recent->child;
        // 在链表中查找要删除的目录节点,要求文件名匹配且是目录(isdir == 1表示是目录)
        while (temp->next && (strcmp(temp->filename, filename)!= 0 || temp->isdir!= 1))
            temp = temp->next;
        // 如果没找到匹配的目录节点
        if (strcmp(temp->filename, filename)!= 0 || temp->isdir!= 1)
        {
            printf("不存在该目录!\n");
            return 0;
        }
    }
    else
    {
        printf("不存在该目录!\n");
        return 0;
    }

    // 如果要删除的节点的父节点为空(特殊情况处理)
    if (temp->parent == NULL)
    {
        temp->prev->next = temp->next;
        if (temp->next)
        {
            temp->next->prev = temp->prev;
        }
        temp->prev = temp->next = NULL;
    }
    else
    {
        if (temp->next)
        {
            temp->next->parent = temp->parent;
        }
        temp->parent->child = temp->next;
    }
    free(temp);
    printf("目录已删除!\n");
    return 0;
}

六.写文件,write()函数,在文件中写数据。

int write() {
    char filename[FILENAME_LENGTH];
    scanf("%s", filename);
    if (recent->child == NULL) {
        // 如果最近访问的节点的子节点为空,表示文件不存在
        printf("文件不存在!\n");
        return 1;
    }
    if (strcmp(recent->child->filename, filename) == 0) {
        scanf("%s", recent->child->content);
        // 待补充
        printf("文件写入成功!\n");
        return 0;
    } else {
        temp = recent->child;
        while (temp->next) {
            if (strcmp(temp->next->filename, filename) == 0) {
                scanf("%s", temp->next->content);
                // 待补充
                printf("文件写入成功!\n");
                return 0;
            }
            temp = temp->next;
        }
        printf("文件不存在!\n");
        return 1;
    }
}

七.思考题 

open()

  1. 功能描述

    • open() 函数用于打开文件或目录,以便进行读写或其他操作。它通常返回一个文件描述符或句柄,这是一个用于在后续操作中引用打开文件的数值或引用。
    • 在文件系统中,open() 可用于设置访问模式(如只读、只写或读写)、共享模式(如是否允许其他进程同时访问)以及其他属性(如同步或异步操作)。
  2. 与其他功能的关系

    • 在你的模拟系统中,open() 可以在执行 read() 或 write() 之前被调用,以确保文件已经以适当的模式打开。
    • open() 可以与 create() 函数关联,例如,在创建新文件后自动打开它进行写操作。
    • 用于跟踪文件是否已经打开,这样可以防止例如删除一个正在使用的文件(通过 del())。

close()

  1. 功能描述

    • close() 函数用于关闭已打开的文件或释放资源。这通常意味着操作系统可以将任何挂起的更改写回存储设备,并且该文件描述符或句柄被释放,可用于其他文件。
    • 正确使用 close() 是确保数据一致性和有效资源管理的关键。
  2. 与其他功能的关系

    • 应该在每次 read() 或 write() 操作完成后调用 close(),以确保所有更改都已同步到文件系统,并且不会有文件描述符泄漏。
    • 在文件或目录被删除之前(使用 del() 或 rm()),应确保该文件或目录已经被关闭,防止删除正在使用的文件。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值