使用C语言实现多进程文件管理器

项目要求

实现一个多进程文件管理器,支持文件的查看信息(ls)、拷贝(cp)、删除(rm)、移动(mv)、更改文件权限(chmod)和查看内容(cat)。每个操作将在一个单独的进程中执行。
技术栈
编程语言:C
系统调用和库:unistd.h, fcntl.h, sys/types.h, sys/stat.h, dirent.h, stdio.h, stdlib.h
实现步骤
文件操作函数:
实现文件的查看信息(ls)、拷贝(cp)、删除(rm)、移动(mv)、更改文件权限(chmod)和查看内容(cat)的函数。
多进程管理:
使用 fork() 创建子进程来执行每个文件操作。
父进程等待子进程完成,使用 wait()。
3.命令行界面:
提供一个简单的命令行界面,允许用户选择操作和指定文件。

项目实现

思路

在主函数中创建进程,
在父进程中使用switch,case来进行选择判断,
在每个case中实现各自的功能

代码

main.c

#include "filecmd.h"

int main(int argc, char *argv[])
{
    int pid = fork();
    int num = 1;
    char src[100] = {0};
    char dst[100] = {0};
    if (pid == 0)
    {
        while (num)
        {
            menu();
            int cmd = 0;
            
            printf("请选择要执行的命令:");
            scanf("%d", &cmd);
            switch (cmd)
            {
            case 1:
                printf("请输入要复制的文件路径和目标路径:");
                scanf("%s %s", src, dst);
                filecmd_cp(src, dst);
                break;
            case 2:
                printf("请输入要移动的文件路径和目标路径:");
                scanf("%s %s", src, dst);
                filecmd_mv(src, dst);
                break;
            case 3:
                printf("请输入要删除的文件路径:");
                scanf("%s", src);
                filecmd_rm(src);
                break;
            case 4:
                printf("请输入要查看的文件路径:");
                scanf("%s", src);
                filecmd_cat(src);
                break;
            case 5:
                printf("请输入要查看的文件路径:");
                scanf("%s", src);
                filecmd_ls(src);
                break;
            case 6:
                printf("请输入要修改权限的文件路径和权限:");
                scanf("%s %s", src, dst);
                filecmd_chmod(src, dst);
                break;
            case 7:
                num = 0;
                break;
            default:
                printf("命令错误\n");
                break;
            }
        }
        exit(EXIT_SUCCESS);
    }
    wait(NULL);
    return 0;
}

filecmd.c

#include"filecmd.h"
void menu()
{
    printf("-------------------1.cp复制------------------\n");
    printf("-------------------2.mv移动------------------\n");
    printf("-------------------3.rm删除------------------\n");
    printf("-------------------4.cat查看-----------------\n");
    printf("-------------------5.ls列出------------------\n");
    printf("-------------------6.chmod更改权限-----------\n");
    printf("-------------------7.exit退出----------------\n");
}
//查看文件信息
void filecmd_ls(char *filepath)
{
    //定义接受文件的属性结构体变量
    struct stat sb;                 //stat buf
    //调用函数,获取文件状态
    if(stat(filepath, &sb) == -1)
    {
        perror("stat error");
        return;
    }

    //程序执行至此,sb中就记录了传入的文件的信息
    //输出文件类型
    switch(sb.st_mode & S_IFMT)
    {
    case S_IFSOCK:
        {
            printf("套接字文件\t");
        }
        break;
    case S_IFLNK:
        {
            printf("链接文件\t");
        }
        break;
    case S_IFREG:
        {
            printf("普通文件\t");
        }
        break;
    case S_IFBLK:
        {
            printf("块设备文件\t");
        }
        break;
    case S_IFDIR:
        {
            printf("目录文件\t");
        }
        break;
    case S_IFCHR:
        {
            printf("字符设备文件\t");
        }
        break;
    case S_IFIFO:
        {
            printf("管道文件\t");
        }
        break;
    }

    //输出文件权限
    printf("%#o\t", sb.st_mode&0777);
    //最后修改时间
    printf("%s\t", ctime(&sb.st_mtime));
    //输出文件大小
    printf("%ld\t", sb.st_size);
    //输出文件inode号
    printf("%ld\n", sb.st_ino);

}
//拷贝文件
void filecmd_cp(char *src, char *dest)
{
    //打开源文件
    int fp_src = open(src,O_RDONLY);
    if(fp_src ==-1)
    {
        perror("open error");
        return;
    }
    //打开目标文件
    int fp_dest = open(dest,O_WRONLY|O_CREAT,0644);
    if(fp_dest == -1)
    {
        perror("open error");
        return;
    }
    //定义搬运工
    char buf[1024] = {0};
    //循环读取源文件,并写入目标文件
    while (1)
    {
        int len = read(fp_src, buf, sizeof(buf));
        if (len == 0)
        {
            break;
        }   
        write(fp_dest, buf, len) != len;
    }
    close(fp_src);
    close(fp_dest);
}
//删除文件
void filecmd_rm(char *filepath)
{
    if(remove(filepath) == -1)
    {
        perror("remove error");
    }
}
//移动文件
void filecmd_mv(char *src, char *dest)
{
    if(rename(src, dest) == -1)
    {
        perror("rename error");
    }
}
//更改文件权限
void filecmd_chmod(char *filepath, char *mode)
{
    //将mode转换为数字
    int mode_num = strtol(mode, NULL, 8);
    if(chmod(filepath, mode_num) == -1)
    {
        perror("chmod error");
    }
}
//查看文件内容
void filecmd_cat(char *filepath)
{
    //打开文件
    int fd = open(filepath, O_RDONLY);
    if(fd == -1)
    {
        perror("open error");
        return;
    }
    //定义搬运工
    char buf[1024] = {0};
    //循环读取文件内容,并打印
    while (read(fd, buf, sizeof(buf)) > 0)
    {
        printf("%s", buf);
    }
    close(fd);
}


filecmd.h

#ifndef FILECMD_H
#define FILECMD_H
#include<myhead.h>
/*
使用C语言实现多进程文件管理器
功能概述
实现一个多进程文件管理器,支持文件的查看信息(ls)、拷贝(cp)、删除(rm)、移动(mv)、更改文件权限(chmod)和查看内容(cat)。每个操作将在一个单独的进程中执行。
技术栈
编程语言:C
系统调用和库:unistd.h, fcntl.h, sys/types.h, sys/stat.h, dirent.h, stdio.h, stdlib.h
实现步骤
文件操作函数:
实现文件的查看信息(ls)、拷贝(cp)、删除(rm)、移动(mv)、更改文件权限(chmod)和查看内容(cat)的函数。
多进程管理:
使用 fork() 创建子进程来执行每个文件操作。
父进程等待子进程完成,使用 wait()。
3. 命令行界面:
提供一个简单的命令行界面,允许用户选择操作和指定文件。
*/
//查看文件信息
void filecmd_ls(char *filepath);
//拷贝文件
void filecmd_cp(char *src, char *dest);
//删除文件
void filecmd_rm(char *filepath);
//移动文件
void filecmd_mv(char *src, char *dest);
//更改文件权限
void filecmd_chmod(char *filepath, char *mode);
//查看文件内容
void filecmd_cat(char *filepath);
//菜单
void menu();
#endif

效果展示

效果展示视频

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值