拆分:
将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; } }