Linux C 达成mycp 可以显示文件拷贝进度
发布时间:2021-11-18 20:55:23 所属栏目:教程 来源:互联网
导读:在Linux系统里面用到 cp命令复制不能显示文件拷贝的进度,也不能计算还有多长时间文件可以 拷贝结束,现在写一个程序可以显示文件拷贝的进度。 思路:当前目录下面有一个1G大小的bigfile文件 当我在命令行下面输入ls -lh bigfile,我会得到这个文件的详细信
|
在Linux系统里面用到 cp命令复制不能显示文件拷贝的进度,也不能计算还有多长时间文件可以 拷贝结束,现在写一个程序可以显示文件拷贝的进度。 思路:当前目录下面有一个1G大小的bigfile文件 当我在命令行下面输入ls -lh bigfile,我会得到这个文件的详细信息,当然也可以看到文件的大小。 www.linuxidc.com@linuxidc~$ ls -lh bigfile -rw-rw-r-- 1 nii nii 1000M 7月 13 19:41 bigfile 我们可以用popen函数,把执行之后的结果”-rw-rw-r– 1 nii nii 1000M 7月 13 19:41 bigfil”这串字符串接收下来,我们可以提取出来表示文件大小的那段字符串,比如这个我们可以提取”1000”在用atoi函数,把字符串转换为int型数值1000(不了解popen函数和atoi函数的请自行学习),就可以获得文件大小。 例如我的文件名字叫mycp.c,我执行gcc -o mycp mycp.c生成一个mycp的可执行文件。 接下来我在命令行上输入./mycp bigfile destbigfile把当前目录下面的bigfile文件拷贝为destbigfile,这时我产生一个子进程,子进程负责调用系统的cp命令拷贝,父进程每隔一秒钟,去获取destbigfile、bigfile 文件的大小,就可以知道拷贝的进度,当然也可以获得拷贝的时间,就可以计算出来离拷贝结束还有多长时间。 下面是代码的实现: #include <stdio.h> #include <errno.h> #include <unistd.h> #include <stdlib.h> #include <signal.h> #include <stdlib.h> #include <string.h> /** 得到文件的详细信息 */ int getFileMsg(char* pchCmd,char *pchMsg); int main(int argc,char* argv[]) { char szSrcFileMsg[150] = {0}; char szSrcFileSizeMsg[10] = {0}; int nSrcFileSize = 0; char szSDestFileMsg[150] = {0}; char szDestFileSizeMsg[10] = {0}; int nDestFileSize = 0; int pid = 0; /** shell执行的命令 ,在创建文件的时候使用*/ char szExcueCommand[150] = {0}; float fRate = 0; int nUsedTime = 0; float nLastTime = 0; /** 入参必须是三个 */ if (1 == argc) { printf("please input the src and des filen"); return -1; } /** 产生子进程 */ pid = fork(); /** 如果是子进程,负责执行复制命令 */ if (0 == pid) { sprintf(szExcueCommand,"%s %s %s","cp",argv[1],argv[2]); printf("%sn",szExcueCommand); system(szExcueCommand); return 0; } /** 父进程负责把正在复制的原文件和复制的目标文件的大小计算出来,就可以知道复制的进度,计算频率为1秒一次 */ else { /** 获得原文件的大小 */ if (-1 == getFileMsg(argv[1],szSrcFileMsg)) { printf("get sorce file message failed n"); return -1; } /** 把原文件大小的信息取出来 */ strncpy(szSrcFileSizeMsg,szSrcFileMsg+21,4); szSrcFileSizeMsg[5] = ' |
