以下是对这次使用C语言实现多进程文件管理器的详细介绍!(超级无敌详细,源代码+输出结果展示,传入函数的参数也有注明,都有蛮详细的注释,非常好理解)
又是一个项目自己能够独立完成了,代码敲的越来越熟练了,解决问题的能力得到了大大大大大大的提高!持续学习持续进步冲冲冲
项目的功能也很简单,就只实现了在当前路径下进行一些操作,每个操作是在单独的进程中执行,采用了分文件编译,如果对你有所帮助的话,欢迎大家白嫖
目录
项目介绍:
1、思路:
1、源代码:
输出结果如下:
1、菜单功能:
2、查看文件信息(ls),可以看出成功输出了当前路径下的所有文件名
3、拷贝文件(cp),将manage.h拷贝成1.txt
4、删除文件(rm),这里我删除了3.txt文件
5、移动文件(mv),这里我移动了1.txt文件,移动后重命名为2.txt
6、更改文件权限(chmod)
7、查看文件内容(cat)
8、退出程序成功
项目介绍:
使用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)
可以看出成功在终端输出了文件里面的内容

8、退出程序成功

