#include
#include
#include
#include
#include
int mycplink(char *name1, char *name2) //复制符号链接
{
char buf[1024]="";
int ret;
ret=readlink(name1, buf, sizeof(buf));
if(ret!=0)
{
symlink(buf , name2 );
}
return 0;
}
int mycp(char *dir1, char *dir2) //复制普通文件
{
int fd1;
int fd2;
int ret;
int sts;
char buf[1024];
fd1=open(dir1, O_RDONLY);
fd2=open(dir2, O_WRONLY|O_CREAT|O_TRUNC, 0666);
while(1)
{
bzero(buf, sizeof(buf));
ret= read(fd1, buf, sizeof(buf)-1 );
if(ret<=0)
break;
sts=write(fd2, buf, ret);
while(sts
{
sts+=write(fd2, buf+sts, ret-sts);
}
}
close(fd1);
close(fd2);
struct stat info;
ret=stat(dir1, &info);
if(ret!=0)
{
perror("stat");
return 1;
}
chmod(dir2, info.st_mode);
return 0;
}
int mycpdir(char *name1, char *name2) //复制目录
{
int ret;
DIR *dir1;
DIR *dir2;
struct dirent *drr;
struct stat info;
struct stat dirinfo;
char buf1[1024];
char buf2[1024];
lstat(name1, &info); //获取name1的信息
dir1=opendir(name1);
if(dir1==NULL)
{
perror("opendir1");
return 1;
}
dir2=opendir(name2); //打开name2, 打开失败则创建
if(dir2==NULL)
{
mkdir(name2, info.st_mode);
dir2=opendir(name2);
}
while(1)
{
bzero(buf2, sizeof(buf2));
bzero(buf2, sizeof(buf2));
drr=readdir(dir1);
if(drr==NULL)break;
if(*drr->d_name=='.') //过滤掉 "." ".."
continue;
sprintf(buf1, "%s/%s", name1, drr->d_name); //构造完整的相对路径
sprintf(buf2, "%s/%s", name2, drr->d_name);
ret=lstat(buf1, &dirinfo);
if(ret<0)
{
perror("lstat\n");
break;
}
if(S_ISDIR(dirinfo.st_mode)) //如果是目录
{
mycpdir(buf1 , buf2);
}
else if(S_ISREG(dirinfo.st_mode)) //如果是普通文件
{
mycp(buf1, buf2);
}
else if(S_ISLNK(dirinfo.st_mode)) //如果是符号链接
{
mycplink(buf1, buf2);
}
}
closedir(dir1);
closedir(dir2);
return 0;
}
int main(int argc, char **argv)
{
if(argc!=3)
goto argc_err;
mycpdir(argv[1], argv[2]); //输入两个路径
return 0;
argc_err:
printf("argc!=3\n");
return 1;
}自己写的,代码比较乱。时间比较晚了,今天就写到这。以后有时间写一个更好点的版本。