【Linux】设计文件系统(C实现)

news2024/12/26 19:15:52

要求:

        (1)可以实现下列几条命令 

                dir     列文件目录
                create  创建文件
                delete  删除文件
                read    读文件        
                write   写文件

        (2)列目录时要列出文件名、存取权限(八进制)、文件长度、时间(创建时间,修改时间以及最后一次访问时间);

        (3)源文件可以进行读写保护。

代码:

定义结构体

typedef struct {
    char name[MAX_NAME_LEN];//最大文件数
    int permission;//权限
    int size;//大小  
    char content[MAX_CONTENT_LEN];//内容
    char create_time[20];  //创建时间
    char modify_time[20];  //修改时间
    char access_time[20];  //最后一次访问时间
} File;

获取当前时间(在显示创建时间,修改时间和访问时间时使用,用于记录当前时间)

//获取当前时间
void get_current_time(char *buffer) {
    time_t now = time(NULL);
    struct tm *t = localtime(&now);
    strftime(buffer, 20, "%Y-%m-%d %H:%M:%S", t);
}

创建文件(创建时注意要赋权)

void create_file() {
    if (file_count >= MAX_FILES) {
        printf("文件数量已达上限,无法创建新文件。\n");
        return;
    }

    char name[MAX_NAME_LEN];
    int permission;
    printf("请输入文件名: ");
    scanf("%s", name);
    printf("请输入文件权限(八进制): ");
    scanf("%o", &permission);

    for (int i = 0; i < file_count; i++) {
        if (strcmp(file_system[i].name, name) == 0) {
            printf("文件已存在。\n");
            return;
        }
    }

    File new_file;
    strcpy(new_file.name, name);
    new_file.permission = permission;
    new_file.size = 0;
    new_file.content[0] = '\0';
    get_current_time(new_file.create_time);
    strcpy(new_file.modify_time, new_file.create_time);
    strcpy(new_file.access_time, new_file.create_time); 

    file_system[file_count++] = new_file;
    printf("文件创建成功。\n");
}

删除文件

void create_file() {
    if (file_count >= MAX_FILES) {
        printf("文件数量已达上限,无法创建新文件。\n");
        return;
    }

    char name[MAX_NAME_LEN];
    int permission;
    printf("请输入文件名: ");
    scanf("%s", name);
    printf("请输入文件权限(八进制): ");
    scanf("%o", &permission);

    for (int i = 0; i < file_count; i++) {
        if (strcmp(file_system[i].name, name) == 0) {
            printf("文件已存在。\n");
            return;
        }
    }

    File new_file;
    strcpy(new_file.name, name);
    new_file.permission = permission;
    new_file.size = 0;
    new_file.content[0] = '\0';
    get_current_time(new_file.create_time);
    strcpy(new_file.modify_time, new_file.create_time);
    strcpy(new_file.access_time, new_file.create_time); 

    file_system[file_count++] = new_file;
    printf("文件创建成功。\n");
}

读文件

void read_file() {
    char name[MAX_NAME_LEN];
    printf("请输入要读取的文件名: ");
    scanf("%s", name);

    for (int i = 0; i < file_count; i++) {
        if (strcmp(file_system[i].name, name) == 0) {
            printf("文件内容:\n%s\n", file_system[i].content);
            get_current_time(file_system[i].access_time);  
            return;
        }
    }
    printf("文件未找到。\n");
}

写文件

void write_file() {
    char name[MAX_NAME_LEN];
    char content[MAX_CONTENT_LEN];
    printf("请输入要写入的文件名: ");
    scanf("%s", name);

    for (int i = 0; i < file_count; i++) {
        if (strcmp(file_system[i].name, name) == 0) {
            printf("请输入文件内容: ");
            getchar(); 
            fgets(content, MAX_CONTENT_LEN, stdin);
            content[strcspn(content, "\n")] = '\0'; 

            strcpy(file_system[i].content, content);
            file_system[i].size = strlen(content);
            get_current_time(file_system[i].modify_time);

            printf("文件写入成功。\n");
            return;
        }
    }
    printf("文件未找到。\n");
}

列出文件

void list_files() {
    if (file_count == 0) {
        printf("目录为空。\n");
        return;
    }

    printf("%-20s %-10s %-10s %-20s %-20s %-20s\n",
           "文件名", "权限", "大小", "创建时间", "修改时间", "访问时间");
    for (int i = 0; i < file_count; i++) {
        printf("%-20s %-10o %-10d %-20s %-20s %-20s\n",
               file_system[i].name,
               file_system[i].permission,
               file_system[i].size,
               file_system[i].create_time,
               file_system[i].modify_time,
               file_system[i].access_time);
    }
}

目录

void menu() {
    printf("\n==== 文件系统 ====\n");
    printf("1. 列文件目录\n");
    printf("2. 创建文件\n");
    printf("3. 删除文件\n");
    printf("4. 读文件\n");
    printf("5. 写文件\n");
    printf("6. 退出\n");
    printf("===================\n");
}

main

int main() {
    int choice;
    while (1) {
        menu();
        printf("请输入选项: ");
        scanf("%d", &choice);

        switch (choice) {
            case 1:
                list_files();
                break;
            case 2:
                create_file();
                break;
            case 3:
                delete_file();
                break;
            case 4:
                read_file();
                break;
            case 5:
                write_file();
                break;
            case 6:
                printf("退出系统。\n");
                return 0;
            default:
                printf("无效选项,请重新输入。\n");
        }
    }
}

各个部分的代码都已分别给出,可自行在此程序上加入自己的逻辑。

完整代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define MAX_FILES 100     //最大文件数
#define MAX_NAME_LEN 50   //文件名字最大长度
#define MAX_CONTENT_LEN 1024 //文件最大内容

typedef struct {
    char name[MAX_NAME_LEN];//最大文件数
    int permission;//权限
    int size;//大小  
    char content[MAX_CONTENT_LEN];//内容
    char create_time[20];  //创建时间
    char modify_time[20];  //修改时间
    char access_time[20];  //最后一次访问时间
} File;


File file_system[MAX_FILES];
int file_count = 0;

//获取当前时间
void get_current_time(char *buffer) {
    time_t now = time(NULL);
    struct tm *t = localtime(&now);
    strftime(buffer, 20, "%Y-%m-%d %H:%M:%S", t);
}

//创建文件
void create_file() {
    if (file_count >= MAX_FILES) {
        printf("文件数量已达上限,无法创建新文件。\n");
        return;
    }

    char name[MAX_NAME_LEN];
    int permission;
    printf("请输入文件名: ");
    scanf("%s", name);
    printf("请输入文件权限(八进制): ");
    scanf("%o", &permission);

    for (int i = 0; i < file_count; i++) {
        if (strcmp(file_system[i].name, name) == 0) {
            printf("文件已存在。\n");
            return;
        }
    }

    File new_file;
    strcpy(new_file.name, name);
    new_file.permission = permission;
    new_file.size = 0;
    new_file.content[0] = '\0';
    get_current_time(new_file.create_time);
    strcpy(new_file.modify_time, new_file.create_time);
    strcpy(new_file.access_time, new_file.create_time); 

    file_system[file_count++] = new_file;
    printf("文件创建成功。\n");
}


//删除文件
void delete_file() {
    char name[MAX_NAME_LEN];
    printf("请输入要删除的文件名: ");
    scanf("%s", name);

    for (int i = 0; i < file_count; i++) {
        if (strcmp(file_system[i].name, name) == 0) {
          
            for (int j = i; j < file_count - 1; j++) {
                file_system[j] = file_system[j + 1];
            }
            file_count--;
            printf("文件删除成功。\n");
            return;
        }
    }
    printf("文件未找到。\n");
}

//读文件
void read_file() {
    char name[MAX_NAME_LEN];
    printf("请输入要读取的文件名: ");
    scanf("%s", name);

    for (int i = 0; i < file_count; i++) {
        if (strcmp(file_system[i].name, name) == 0) {
            printf("文件内容:\n%s\n", file_system[i].content);
            get_current_time(file_system[i].access_time);  
            return;
        }
    }
    printf("文件未找到。\n");
}


//写文件
void write_file() {
    char name[MAX_NAME_LEN];
    char content[MAX_CONTENT_LEN];
    printf("请输入要写入的文件名: ");
    scanf("%s", name);

    for (int i = 0; i < file_count; i++) {
        if (strcmp(file_system[i].name, name) == 0) {
            printf("请输入文件内容: ");
            getchar(); 
            fgets(content, MAX_CONTENT_LEN, stdin);
            content[strcspn(content, "\n")] = '\0'; 

            strcpy(file_system[i].content, content);
            file_system[i].size = strlen(content);
            get_current_time(file_system[i].modify_time);

            printf("文件写入成功。\n");
            return;
        }
    }
    printf("文件未找到。\n");
}

//列出文件
void list_files() {
    if (file_count == 0) {
        printf("目录为空。\n");
        return;
    }

    printf("%-20s %-10s %-10s %-20s %-20s %-20s\n",
           "文件名", "权限", "大小", "创建时间", "修改时间", "访问时间");
    for (int i = 0; i < file_count; i++) {
        printf("%-20s %-10o %-10d %-20s %-20s %-20s\n",
               file_system[i].name,
               file_system[i].permission,
               file_system[i].size,
               file_system[i].create_time,
               file_system[i].modify_time,
               file_system[i].access_time);
    }
}


//目录
void menu() {
    printf("\n==== 文件系统 ====\n");
    printf("1. 列文件目录\n");
    printf("2. 创建文件\n");
    printf("3. 删除文件\n");
    printf("4. 读文件\n");
    printf("5. 写文件\n");
    printf("6. 退出\n");
    printf("===================\n");
}

int main() {
    int choice;
    while (1) {
        menu();
        printf("请输入选项: ");
        scanf("%d", &choice);

        switch (choice) {
            case 1:
                list_files();
                break;
            case 2:
                create_file();
                break;
            case 3:
                delete_file();
                break;
            case 4:
                read_file();
                break;
            case 5:
                write_file();
                break;
            case 6:
                printf("退出系统。\n");
                return 0;
            default:
                printf("无效选项,请重新输入。\n");
        }
    }
}

运行结果(在虚拟机上运行)

1).创建文件

2).列出文件

3).写文件

4).读文件

5).删除文件

6).删除文件

小结:

        首先注意此代码在linux中编译时可能会报错如下:

因为我的代码中使用了 C99 标准引入的特性——for 循环中声明变量。然而,编译器默认未启用 C99 模式,因此报错。 

解决方法:在编译时指定用c99模式,因为 C99 是现代 C 标准,支持更多特性,所以我没有考虑将代码切换兼容 C89。

列表显示时对齐问题,占位符有讲究(为了尽量得体的显示)(给出的代码的占位符都是设计的尽量显示正常的)

开始时时间都无法在同一行显示,显然有问题

那么代码就能正常运行啦,但是因为博主技术水平问题,只能写出这样的代码供大家参考。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2253276.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Java Springboot武汉市公交路线查询APP且微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信…

单片机-- 松瀚sonix学习过程

硬件&#xff1a;松瀚sn8f5701sg、SN-LINK 3 Adapter模拟器、sn-link转接板 软件&#xff1a; keil-c51&#xff08;v9.60&#xff09;&#xff1a;建立工程&#xff0c;编辑&#xff0c;烧录程序 SN-Link_Driver for Keil C51_V3.00.005&#xff1a;安装sonix设备包和snlin…

http(请求方法,状态码,Cookie与)

目录 1.http中常见的Header(KV结构) 2.http请求方法 2.1 请求方法 2.2 telnet 2.3 网页根目录 2.3.1 概念 2.3.2 构建一个首页 2.4 GET与POST方法 2.4.1 提交参数 2.4.2 GET与POST提交参数对比 2.4.3 GET和POST对比 3.状态码 3.1 状态码分类 3.2 3XXX状态码 3.2 …

实现PDF文档加密,访问需要密码

01. 背景 今天下午老板神秘兮兮的来问我&#xff0c;能不能做个文档加密功能&#xff0c;就是那种用户下载打开需要密码才能打开的那种效果。boss都发话了&#xff0c;那必须可以。 需求&#xff1a;将 pdf 文档经过加密处理&#xff0c;客户下载pdf文档&#xff0c;打开文档需…

机器学习周志华学习笔记-第13章<半监督学习>

机器学习周志华学习笔记-第13章&#xff1c;半监督学习&#xff1e; 卷王&#xff0c;请看目录 13半监督学习13.1 生成式方法13.2 半监督SVM13.3 基于分歧的方法13.4 半监督聚类 13半监督学习 前面我们一直围绕的都是监督学习与无监督学习&#xff0c;监督学习指的是训练样本包…

106.【C语言】数据结构之二叉树的三种递归遍历方式

目录 1.知识回顾 2.分析二叉树的三种遍历方式 1.总览 2.前序遍历 3.中序遍历 4.后序遍历 5.层序遍历 3.代码实现 1.准备工作 2.前序遍历函数PreOrder 测试结果 3.中序遍历函数InOrder 测试结果 4.后序遍历函数PostOrder 测试结果 4.底层分析 1.知识回顾 在99.…

1.Git安装与常用命令

前言 Git中会用到的一些基本的Linux命令 ls/ll 查看文件目录 (ll可以看隐藏文件)cat 查看文件内容touch 创建文件vi vi编辑器 1.下载与安装 安装成功后鼠标右键会出现Git Bash和Git GUI Git GUI&#xff1a;GUI图形化界面 Git Bash&#xff1a;Git提供的命令行工具 当安装…

HarmonyOS开发中,如何高效定位并分析内存泄露相关问题

HarmonyOS开发中&#xff0c;如何高效定位并分析内存泄露相关问题 (1)Allocation的应用调试方式Memory泳道Native Allocation泳道 (2)Snapshot(3)ASan的应用使用约束配置参数使能ASan方式一方式二 启用ASanASan检测异常码 (4)HWASan的应用功能介绍约束条件使能HWASan方式一方式…

Spring Cloud+Nacos+KMS 动态配置最佳实践

作者&#xff1a;柳遵飞 前言 Spring Cloud 框架在微服务领域被广大开发者所使用&#xff0c;Value 是每位开发者都会接触到的注解&#xff0c;在 SpringBean 中可以通过 Value 注解引用 application.properties 属性&#xff0c;实现配置代码分离&#xff0c;提升应用代码部…

HTML 快速上手

目录 一. HTML概念 二. HTML标签 1. 标题标签 2. 段落标签 3. 换行标签 4. 图片标签 5. 超链接标签 6. 表格标签 7. 表单标签 7.1 form 标签 7.2 input 标签 (1) 文本框 (2) 单选框 (3) 密码框 (4) 复选框 (5) 普通按钮 (6) 提交按钮 8. select标签 9. 无语义…

微软表示不会使用你的 Word、Excel 数据进行 AI 训练

​微软否认使用 Microsoft 365 应用程序&#xff08;包括 Word、Excel 和 PowerPoint&#xff09;收集数据来训练公司人工智能 (AI) 模型的说法。 此前&#xff0c;Tumblr 的一篇博文声称&#xff0c;雷德蒙德使用“互联体验”功能抓取客户的 Word 和 Excel 数据&#xff0c;用…

「Mac畅玩鸿蒙与硬件36」UI互动应用篇13 - 数字滚动抽奖器

本篇将带你实现一个简单的数字滚动抽奖器。用户点击按钮后&#xff0c;屏幕上的数字会以滚动动画的形式随机变动&#xff0c;最终显示一个抽奖数字。这个项目展示了如何结合定时器、状态管理和动画实现一个有趣的互动应用。 关键词 UI互动应用数字滚动动画效果状态管理用户交…

Selenium3+Python如何操作键盘

selenium操作键盘&#xff0c;需要导入Keys类&#xff1a;“from selenium.webdriver.common.keys import Keys” 调用键盘操作的快捷键的方法 &#xff1a; 单键值&#xff1a;直接传入对应的键值“element.send_keys”(快捷键的键值) 组合键&#xff1a;键值之间由逗号分隔…

从技术视角看AI在Facebook全球化中的作用

在全球化日益加深的今天&#xff0c;人工智能&#xff08;AI&#xff09;作为一种变革性技术&#xff0c;正在深刻影响全球互联网巨头的发展方向。Facebook作为全球最大的社交媒体平台之一&#xff0c;正通过AI技术突破语言、文化和技术的障碍&#xff0c;推动全球化战略的实现…

jmeter 压测常用静默参数解释应用

简介&#xff1a; JMeter静默压测&#xff08;即无界面压测&#xff09;是一种常用的性能测试方法&#xff0c;用于模拟多个用户同时访问系统并测量系统的响应时间和吞吐量等关键性能指标。在JMeter静默压测中&#xff0c;常用的压测参数及其解释如下&#xff1a; 一、基本…

【机器学习】分类任务: 二分类与多分类

二分类与多分类&#xff1a;概念与区别 二分类和多分类是分类任务的两种类型&#xff0c;区分的核心在于目标变量&#xff08;label&#xff09;的类别数&#xff1a; 二分类&#xff1a;目标变量 y 只有两个类别&#xff0c;通常记为 y∈{0,1} 或 y∈{−1,1}。 示例&#xff…

【自用】管材流转项目前端重部署流程 vue2 webpackage4 vuecli4

一、配置 1.下载项目&#xff0c;使用 IDEA 打开&#xff0c;并配置 Nodejs 它提示我&#xff0c;需要 Node.js&#xff0c;因为 nodejs 14 的 installer 已经官网已经找不到了&#xff0c;使用 fnm 又太麻烦&#xff0c; 所以直接采用在 IDEA 中下载的方式就好了。 2.清除缓…

java调用ai模型:使用国产通义千问完成基于知识库的问答

整体介绍&#xff1a; 基于RAG&#xff08;Retrieval-Augmented Generation&#xff09;技术&#xff0c;可以实现一个高效的Java智能问答客服机器人。核心思路是将预先准备的问答QA文档&#xff08;例如Word格式文件&#xff09;导入系统&#xff0c;通过数据清洗、向量化处理…

跨平台应用开发框架(4)----Qt(系统篇)

目录 1.Qt事件 1.事件来源 2.事件处理 3.按键事件 1.组合按键 4.鼠标事件 1.鼠标单击事件 2.鼠标释放事件 3.鼠标双击事件 4.鼠标移动事件 5.滚轮事件 5.定时器 1.QTimerEvent类 2.QTimer 类 3.获取系统日期及时间 6.事件分发器 7.事件过滤器 2.Qt文件 1.输入…

算法刷题Day8:BM30 二叉搜索树与双向链表

题目 牛客网题目传送门 思路 对二叉搜索树进行中序遍历&#xff0c;结果就是按序数组。因此想办法把前面遍历过的节点给记下来&#xff0c;记作pre。当遍历到某个节点node的时候&#xff0c;令前驱指向pre&#xff0c;然后让pre的后驱指向node。 代码 class TreeNode:def…