Linux教程

Linux之文件拆分与合并

本文主要是介绍Linux之文件拆分与合并,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

拆分:

将Linux下的文件拆分为多个1MB的小文件,便于发送与上传等操作

拆分所使用到的函数与结构体:

umask(int);//用于读写文件后的权限问题

struct stat s_buf;//用于保存文件信息

stat(const char *, stat *);//将路径中的文件信息保存到stat结构体中

S_ISREG(stat.st_mode);//判断是否为文件,若为文件,则返回1,否则返回0

ceil(float);//向上取整,用于判断要拆分多少个文件

主要操作流程:

先读取文件路径,判断所给的是否为文件,若为文件则获取文件大小,除以1MB,判断拆分文件的个数;

然后打开读取文件,使用while循环,创建子进程,在子进程中写文件数据,父进程用while循环逐个等待子进程的结束,避免出现僵尸进程

以下为代码:

//将文件拆分到指定路径
int SplitFile(string filepath,string tofilepath)
{
	int count;//已拆分的文件个数
	int size = 0;//预计拆分的文件个数
	int readfd = 0;//读文件
	int writefd = 0;//写文件
	int resbuf = 0;//读到的字符数
	char buf[102400] = { 0 };//每个文件的大小
	int num = 1;//拆分文件的文件名序号
	string writePath;//拆分生成的文件名
	int pid = 0;//子进程的pid
	int res = 0;//父进程接收到的子进程pid
	int status = 0;//接收到子进程完成所返回的信息
	struct stat s_buf;//文件信息
	umask(0);
	stat(filepath.c_str(), &s_buf);
	if (!S_ISREG(s_buf.st_mode))
	{//不是文件,直接结束
		cout << "所给的路径并非文件路径,函数结束" << endl;
		return -1;
	}
	cout << "需要拆分的文件大小为:" << s_buf.st_size << endl;
	size = ceil(float(s_buf.st_size / 102400.00));//计算需要拆分文件的个数,向上取整
	cout << "需要拆分的文件个数为:" << size << endl;
	readfd = open(filepath.c_str(), O_RDONLY, 0777);
	if (read < 0)
	{
		perror("文件读取失败");
		return -1;
	}
	else
	{
		while ((resbuf = read(readfd, buf, sizeof(buf))) > 0)
		{
			writePath = tofilepath + to_string(num) + ".tmp";

			cout << "写路径:" << writePath << endl;
			num++;
			pid = fork();
			if (pid == 0)
			{//子进程做拆分
				writefd = open(writePath.c_str(), O_CREAT | O_WRONLY, 0777);
				int res = write(writefd, buf, resbuf);
				if (res > 0)
				{
					close(writefd);
					bzero(buf, sizeof(buf));
					writePath.clear();
				}
				else
				{
					perror("读取失败");
				}
				exit(0);
			}
			else if (pid > 0)
			{

			}
		}
		//父进程
		while (count < size)
		{
			res = wait(&status);
			if (res > 0)
			{
				//cout << "res=" << res << "拆分完毕" << endl;
				count++;
			}
		}
		cout << "所有拆分完毕" << endl;
		return 0;
	}
}

这篇关于Linux之文件拆分与合并的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!