项目要求
实现一个多进程文件管理器,支持文件的查看信息(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
效果展示
效果展示视频