十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
在Linux系统里面用到 cp命令复制不能显示文件拷贝的进度,也不能计算还有多长时间文件可以 拷贝结束,现在写一个程序可以显示文件拷贝的进度。
创新互联服务项目包括亚东网站建设、亚东网站制作、亚东网页制作以及亚东网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,亚东网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到亚东省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
思路:当前目录下面有一个1G大小的bigfile文件
当我在命令行下面输入ls -lh bigfile,我会得到这个文件的详细信息,当然也可以看到文件的大小。
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
#include
#include
#include
#include
#include
#include
/** 得到文件的详细信息 */
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 file\n");
return -1;
}
/** 产生子进程 */
pid = fork();
/** 如果是子进程,负责执行复制命令 */
if (0 == pid)
{
sprintf(szExcueCommand,"%s %s %s","cp",argv[1],argv[2]);
printf("%s\n",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] = '\0';
nSrcFileSize = atoi(szSrcFileSizeMsg);
while(1)
{
sleep(1);
nUsedTime ++;
/** 获得目标文件的大小 */
if (-1 == getFileMsg(argv[2],szSDestFileMsg))
{
printf("get dest file message failed \n");
return -1;
}
/** 把原文件大小的信息取出来 */
strncpy(szDestFileSizeMsg,szSDestFileMsg+21,4);
szDestFileSizeMsg[5] = '\0';
nDestFileSize = atoi(szDestFileSizeMsg);
/*** 计算复制的进度 */
fRate = (nDestFileSize * 100) / nSrcFileSize ;
/** 计算剩下的时间 */
nLastTime = ((100 - fRate) * nUsedTime) / fRate;
/** 打印进度条 */
printf("已复制 %.2f %% 还需要 %.1f 秒\n",fRate,nLastTime);
/** 复制完成之后,退出循环 */
if (nSrcFileSize == nDestFileSize)
{
printf("复制完成,耗时 %d 秒\n",nUsedTime);
break;
}
}
}
return 0;
}
/** 得到文件的详细信息 */
int getFileMsg(char* pchCmd,char *pchMsg)
{
FILE *fstream=NULL;
char szBuff[BUFSIZ] = {0};
char szExcueCommand[150] = {"ls -lh"};
sprintf(szExcueCommand,"%s %s",szExcueCommand,pchCmd);
if (NULL==(fstream=popen(szExcueCommand,"r")))
{
perror("execute command failed: ");
return -1;
}
/** 得到命令的结果 */
if (NULL == fgets(szBuff, sizeof(szBuff), fstream))
{
pclose(fstream);
return -1;
}
pclose(fstream);
strcpy(pchMsg,szBuff);
return 0;
}
Linux下执行结果为:
./mycp bigfile destbigfile
cp bigfile destbigfile
已复制 3.00 % 还需要 32.3 秒
已复制 5.00 % 还需要 38.0 秒
已复制 8.00 % 还需要 34.5 秒
已复制 10.00 % 还需要 36.0 秒
已复制 12.00 % 还需要 36.7 秒
已复制 13.00 % 还需要 40.2 秒
已复制 14.00 % 还需要 43.0 秒
已复制 17.00 % 还需要 39.1 秒
已复制 20.00 % 还需要 36.0 秒
已复制 21.00 % 还需要 37.6 秒
已复制 24.00 % 还需要 34.8 秒
已复制 24.00 % 还需要 38.0 秒
已复制 27.00 % 还需要 35.1 秒
已复制 32.00 % 还需要 29.8 秒
已复制 33.00 % 还需要 30.5 秒
已复制 35.00 % 还需要 29.7 秒
已复制 38.00 % 还需要 27.7 秒
已复制 41.00 % 还需要 25.9 秒
已复制 42.00 % 还需要 26.2 秒
已复制 43.00 % 还需要 26.5 秒
已复制 44.00 % 还需要 26.7 秒
已复制 48.00 % 还需要 23.8 秒
已复制 50.00 % 还需要 23.0 秒
已复制 52.00 % 还需要 22.2 秒
已复制 53.00 % 还需要 22.2 秒
已复制 53.00 % 还需要 23.1 秒
已复制 57.00 % 还需要 20.4 秒
已复制 59.00 % 还需要 19.5 秒
已复制 61.00 % 还需要 18.5 秒
已复制 63.00 % 还需要 17.6 秒
已复制 63.00 % 还需要 18.2 秒
已复制 66.00 % 还需要 16.5 秒
已复制 69.00 % 还需要 14.8 秒
已复制 70.00 % 还需要 14.6 秒
已复制 72.00 % 还需要 13.6 秒
已复制 73.00 % 还需要 13.3 秒
已复制 75.00 % 还需要 12.3 秒
已复制 78.00 % 还需要 10.7 秒
已复制 79.00 % 还需要 10.4 秒
已复制 82.00 % 还需要 8.8 秒
已复制 83.00 % 还需要 8.4 秒
已复制 84.00 % 还需要 8.0 秒
已复制 87.00 % 还需要 6.4 秒
已复制 90.00 % 还需要 4.9 秒
已复制 91.00 % 还需要 4.5 秒
已复制 93.00 % 还需要 3.5 秒
已复制 93.00 % 还需要 3.5 秒
已复制 96.00 % 还需要 2.0 秒
已复制 99.00 % 还需要 0.5 秒
已复制 100.00 % 还需要 0.0 秒
复制完成,耗时 50 秒
cp命令可以拷贝 -r 包括下级 例如 复制aaa目录 cp -r aaa/具体可以看看《linux就该这么学》
linux拷贝文件夹命令——CP命令。
格式:CP[选项]源文件或目录目的文件或目录。
选项说明:-b同名,备分原来的文件。-f强制覆盖同名文件。-r按递归方式保留原目录结构复制文件。
上述方法无法复制原始文本中的一些符号。
上述方法先打印后复制,可以将符号复制过去。
[1] linux命令模式下怎么把一个文本中的一行复制到另一个文本中?
[2] Linux里如何用管道和重新定向把一个文本里的指定行复制到另一个文本里去?
Linux复制命令用cp来进行复制操作。
1、首先需要打开Linux系统,如图所示,进入到主目录。
2、在主目录中创建一个students目录,命令:mkdir students来做演示。
3、进入到students目录中,如图所示,再创建两个目录。
4、进入到fuzhi1目录,用touch命令创建一个6.JPG文件。
5、用cp命令将6.JPG文件移动到fuzhi2目录中。
6、用cd ~/students/fuzhi2命令进入到fuzhi2目录中。
7、最后,用ls命令检查JPG文件成功复制到fuzhi2目录,这样操作就可以看到已经复制成功。
常用的命令为# cp命令
方式一:对文件进行copy:
#cp object_file source_file
方式二:对目录下文件进行copt:
#cp -r object_file source_file
补充cp的参数:
用法:cp [选项]... [-T] 源文件 目标文件
或:cp [选项]... 源文件... 目录
或:cp [选项]... -t 目录 源文件...
将源文件复制至目标文件,或将多个源文件复制至目标目录。
长选项必须使用的参数对于短选项时也是必需使用的。
-a, --archive 等于-dR --preserve=all
--backup[=CONTROL 为每个已存在的目标文件创建备份
-b 类似--backup 但不接受参数
--copy-contents 在递归处理是复制特殊文件内容
-d 等于--no-dereference --preserve=links
-f, --force 如果目标文件无法打开则将其移除并重试(当 -n 选项
存在时则不需再选此项)
-i, --interactive 覆盖前询问(使前面的 -n 选项失效)
-H 跟随源文件中的命令行符号链接
-l, --link 链接文件而不复制
-L, --dereference 总是跟随符号链接
-n, --no-clobber 不要覆盖已存在的文件(使前面的 -i 选项失效)
-P, --no-dereference 不跟随源文件中的符号链接
-p 等于--preserve=模式,所有权,时间戳。《Linux就该这么学》里有相关介绍,建议看看。