【IO项目】使用C语言实现多进程文件管理器(超详细!源代码+输出结果展示)

 

        以下是对这次使用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、退出程序成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值