- 论坛徽章:
- 0
|
很喜欢C,但水平很差。希望能向高手们学习。
用cp命令时,有时遇到大点的文件,就只有傻等,不知道什么时候才能cp完毕。于是写了一个带有进度条的mcp,仅仅有最基本的功能。望高手们指点,改进。
新手上路,请轻拍。
mcp.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define ERR_EXIT(m)\
do\
{\
perror(m);\
exit(-1);\
}while(0)
int p_len(int p_len, int sum_len);
int main(int argc, char* argv[])
{
int s_file,d_file,s_size,d_size,num;
struct stat st_buf;
char buf[512];
if(argc!=3)
{
printf("This is a program for copy file\n");
printf("please input 2 file name\n");
printf("example:\tmycp file1 file2\n");
exit(-1);
}
s_file=open(argv[1],O_RDONLY);
if(s_file==-1)
ERR_EXIT("Open source file error");
if(stat(argv[1],&st_buf))
ERR_EXIT("Get source file stat error");
s_size=st_buf.st_size;
d_file=open(argv[2],O_WRONLY|O_CREAT,0644);
if(d_file==-1)
ERR_EXIT("Open destination file error");
d_size=0;
while((num=read(s_file,buf,512))>0)
{
if((write(d_file,buf,512))==-1)
ERR_EXIT("Write file error");
sync();
if(stat(argv[2],&st_buf))
ERR_EXIT("Get destination file error");
d_size=st_buf.st_size;
p_len(d_size,s_size);
}
printf("\n");
printf("File copy to complete\n");
close(s_file);
close(d_file);
return 0;
}
int p_len(int p_len, int sum_len)
{
int i,width,sum_width;
system("export COLUMNS");
sum_width=atoi(getenv("COLUMNS"));
// printf("The terminal width is:%d\n",width);
width=sum_width-15;
printf("\r[");
for(i=1;i<=abs(p_len*width/sum_len);i++)
printf(">");
for(i=1;i<=width-abs(p_len*width/sum_len);i++)
printf("=");
printf("] %.2f%%",(float)p_len*100/sum_len);
fflush(stdout);
return 0;
}
|
|