/*
* By name fcp.c
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <libgen.h>
#define MAXSIZE 1024
int main(int argc,char **argv)
{
int fnew,fold;
char buf[MAXSIZE],*tmp;
int readnum,writenum;
int s;
struct stat fstat,newstat;
if(argc!=3)
{
printf("Usage:./fcp oldfile newfile \n");
exit(-1);
}
if(stat(argv[1],&fstat)==-1)
{ /* 获取文件信息 */
perror("Stat error");
exit(-1);
}
stat(argv[2],&newstat);
if(S_ISDIR(newstat.st_mode))
{ /* 如果目的文件是一个目录,则在目录后添加文件名 */
strcat(argv[2],basename(argv[1]));
}
else if((s=access(argv[2],F_OK))==0)
{ /* 目的文件是否已存在 */
printf("File %s existed . \n",argv[2]);
exit(-1);
}
else if(!S_ISREG(fstat.st_mode))
{ /* 源文件是否是普通文件 */
printf("%s is not a common file! \n",argv[1]);
exit(-1);
}
if((fold=open(argv[1],O_RDONLY))==-1)
{ /* 打开源文件 */
perror("Open 1 error");
exit(-1);
}
if((fnew=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1)
{ /* 创建目的文件 */
perror("Open 2 error");
exit(-1);
}
while(readnum=read(fold,buf,MAXSIZE))
{
/* 开始COPY */
if((readnum==-1)&&(errno!=EINTR)) break;
else if(readnum>0)
{
tmp=buf;
while(writenum=write(fnew,tmp,readnum))
{
if((writenum==-1)&&(errno!=EINTR))break;
/* 写完了所有读的字节 */
else if(writenum==readnum) break;
/* 只写了一部分,继续写 */
else if(writenum>0)
{
tmp+=writenum;
readnum-=writenum;
}
}
if(writenum==-1)break;
}
}
close(fnew);
close(fold);
}
|