以下是对这次使用C语言实现多进程文件管理器的详细介绍!(超级无敌详细,源代码+输出结果展示,传入函数的参数也有注明,都有蛮详细的注释,非常好理解)
又是一个项目自己能够独立完成了,代码敲的越来越熟练了,解决问题的能力得到了大大大大大大的提高!持续学习持续进步冲冲冲
项目的功能也很简单,就只实现了在当前路径下进行一些操作,每个操作是在单独的进程中执行,采用了分文件编译,如果对你有所帮助的话,欢迎大家白嫖
目录
2、查看文件信息(ls),可以看出成功输出了当前路径下的所有文件名
5、移动文件(mv),这里我移动了1.txt文件,移动后重命名为2.txt
项目介绍:
使用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. 命令行界面:
提供一个简单的命令行界面,允许用户选择操作和指定文件。
1、思路:
1>首先在主函数里面,判断用户想执行的功能,用switch语句来实现
2>接下来就是进行函数的封装,其中比较重要的是创建进程的函数,每次调用这个函数,都会生成一个新的进程,同时在子进程中用if语句判断功能,然后依次对应的执行
3>完成查看信息(ls)、拷贝(cp)、删除(rm)、移动(mv)、更改文件权限(chmod)和查看内容(cat)这些内容的函数封装
4>这样子就完成啦,只需要一点点的耐心和一点点的耐心就能成功完成这个小项目
1、源代码:
分别是manage.h,manage.c,main.c
//manage.h,用于声明函数等
#ifndef MANAGE_H
#define MANAGE_H
#include <myhead.h>
// 创建菜单
void view_create();
// 创建进程
//参数:传入一个字符串,用来后面if语句的判断,以实现不同的功能
void process_create(char *input);
// 查看信息(ls)
//参数:文件路径
void file_ls(char *filepath);
// 拷贝(cp)
//参数1:源文件
//参数2:目标文件
void file_cp(char *src,char *dest);
// 删除(rm)
//参数:源文件
void file_rm(char *src);
// 移动(mv)
//参数1:源文件
//参数2:移动之后的文件名
void file_mv(char *old_file,char *new_file);
// 更改文件权限(chmod)
//参数1:需要修改权限的文件名
//参数2:权限值
void file_chmod(char *src,char *mode);
// 查看内容(cat)
//参数:需要查看的文件名
void file_cat(char *src);
#endif
//manage.c
#include "manage.h"
// 创建菜单
void view_create()
{
// 分别对应不同的功能
printf("**********文件管理菜单**********\n");
printf("1. 查看文件信息(ls)\n");
printf("2. 拷贝文件(cp)\n");
printf("3. 删除文件(rm)\n");
printf("4. 移动文件(mv)\n");
printf("5. 更改文件权限(chmod)\n");
printf("6. 查看文件内容(cat)\n");
printf("0. 退出(exit)\n");
printf("请输入你需要实现的功能:");
}
// 创建进程
void process_create(char *input)
{
// 创建进程
pid_t pid = -1;
pid = fork();
if (pid < 0)
{
perror("fork error");
return;
}
else if (pid == 0)
{
// 子进程
// 判断输入的功能
if (strcmp(input, "ls") == 0)
{
// 1、执行查看信息功能(ls)
file_ls("./"); //默认打开当前路径
}
if (strcmp(input, "cp") == 0)
{
// 2、执行拷贝功能(cp)
char src[30] = "",dest[30] = "";
printf("请输入你需要进行拷贝的两个文件:");
scanf("%s %s",src,dest);
getchar();
file_cp(src,dest);
}
if (strcmp(input, "rm") == 0)
{
char src[30] = "";
// 3、执行删除功能(rm)
printf("请输入你需要删除的文件:");
scanf("%s",src);
getchar();
file_rm(src);
}
if (strcmp(input, "mv") == 0)
{
char old_file[30] = "",new_file[30] = "";
// 4、执行移动功能(mv)
printf("请输入你需要进移动的文件和移动后的文件:");
scanf("%s %s",old_file,new_file);
getchar();
file_mv(old_file,new_file);
}
if(strcmp(input, "chmod") == 0)
{
char src[30] = "";
char mode[10] = "";
printf("请输入你需要修改权限的文件名:");
scanf("%s",src);
getchar();
printf("请输入你需要设置的权限:");
scanf("%s",mode);
getchar();
// 5、执行更改文件权限功能(chmod)
file_chmod(src,mode);
}
if(strcmp(input, "cat") == 0)
{
char src[30] = "";
printf("请输入你需要查看的文件:");
scanf("%s",src);
getchar();
// 6、执行查看内容功能(cat)
file_cat(src);
}
// 退出进程
exit(EXIT_SUCCESS);
}
// 父进程
// 回收进程资源
wait(NULL);
}
//查看信息(ls)
//参数:文件路径
void file_ls(char *filepath)
{
// 打开目录
DIR *dir = opendir(filepath);
if (dir == NULL)
{
perror("opendir");
return;
}
// 读取目录
struct dirent *ent = readdir(dir);
while (ent != NULL)
{
printf("%s\t", ent->d_name);
ent = readdir(dir);
}
printf("\n\n");
// 关闭目录
closedir(dir);
}
//拷贝(cp)
//参数1:源文件
//参数2:目标文件
void file_cp(char *src,char *dest)
{
int fd_src,fd_dest;
//以只读的形式打开源文件
if((fd_src = open(src,O_RDONLY)) == -1)
{
perror("opensrc error");
return ;
}
//以读写的形式打开目标文件
if((fd_dest = open(dest,O_RDWR|O_CREAT,0664)) == -1)
{
perror("opendest error");
return ;
}
//定义一个接受数据的容器
char buf[128] = "";
while(1)
{
int len = 0;
if((len = read(fd_src,buf,sizeof(buf))) == 0)
{
break;
}
write(fd_dest,buf,len);
}
//关闭文件
close(fd_src);
close(fd_dest);
printf("拷贝成功\n");
}
// 删除(rm)
//参数:源文件
void file_rm(char *src)
{
//删除文件
if(remove(src) == -1)
{
perror("remove error");
return ;
}
printf("成功删除文件\n");
}
// 移动(mv)
void file_mv(char *old_file,char *new_file)
{
//首先将文件拷贝一份
//调用拷贝函数
file_cp(old_file,new_file);
//删除老的文件
file_rm(old_file);
printf("\n");
}
// 更改文件权限(chmod)
//参数:需要修改权限的文件名
void file_chmod(char *src,char *mode)
{
//将mode转换成八进制
int mode_num = strtol(mode, NULL, 8);
if((chmod(src,mode_num)) == -1)
{
perror("chomd error");
return ;
}
printf("修改文件权限成功,当前文件权限为:%s\n",mode);
}
// 查看内容(cat)
//参数:需要查看的文件名
void file_cat(char *src)
{
//定义文件描述符
int fd_src;
//以只读的形式打开需要查看的文件
if((fd_src = open(src,O_RDONLY)) == -1)
{
perror("opensrc error");
return ;
}
//定义一个容器接受读取出来的内容
char buf[128] = "";
//循环读取文件中的内容,输出到终端上
while(1)
{
//接收返回的长度
int len = 0;
if((len = read(fd_src,buf,sizeof(buf))) == 0)
{
break;
}
write(STDOUT_FILENO,buf,len);
}
printf("\n");
}
//main.c
#include "manage.h"
#include <myhead.h>
int main(int argc, const char *argv[])
{
char input[20] = ""; //定义一个接受输入信息的容器
int num = 0;
while(1)
{
//生成选择菜单
view_create();
//输入需要实现的功能序号
scanf("%d",&num);
getchar();
//使用switch函数分别对应不同的功能
switch(num)
{
case 1:
//执行信息查看功能(ls)
printf("查找出的信息如下所示:\n");
strcpy(input,"ls");
process_create(input);
break;
case 2:
//执行文件拷贝功能(cp)
strcpy(input,"cp");
process_create(input);
printf("\n");
break;
case 3:
//执行删除功能(rm)
strcpy(input,"rm");
process_create(input);
printf("\n");
break;
case 4:
//执行移动功能(mv)
strcpy(input,"mv");
process_create(input);
printf("\n");
break;
case 5:
//执行更改文件权限功能(chmod)
strcpy(input,"chmod");
process_create(input);
printf("\n");
break;
case 6:
//执行查看文件内容功能(cat)
strcpy(input,"cat");
process_create(input);
printf("\n");
break;
case 0:
//输入0退出程序
goto END;
break;
default:
printf("输入错误请重新输入\n");
}
}
END:
printf("退出程序成功\n");
return 0;
}
输出结果如下:
1、菜单功能:
2、查看文件信息(ls),可以看出成功输出了当前路径下的所有文件名
3、拷贝文件(cp),将manage.h拷贝成1.txt
成功拷贝:
拷贝后的内容可以看出来和manage.h里面的完全一致
4、删除文件(rm),这里我删除了3.txt文件
成功删除,路径下没有该文件了
5、移动文件(mv),这里我移动了1.txt文件,移动后重命名为2.txt
这里只是完成了在该路径下移动的功能,没有实现能够移动到另外一个路径下
原理是,先拷贝一份生成一份新文件,之后再删除源文件
移动成功,移动之后变成了2.txt,文件内容没有发生改变
6、更改文件权限(chmod)
原本的文件权限:
更改之后,改成0444,全部都是只读权限
7、查看文件内容(cat)
可以看出成功在终端输出了文件里面的内容