关于拷贝文件,前面写过一个例子:点击打开链接 ,可以看看,实现cp命令。
这次我们实现一个目录和文件的拷贝,综合点。
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <sys/stat.h>
#include <dirent.h>
void copy_file(const char *src , const char *dest);
void copy_directory(const char *src , const char *dest , const char *name);
int main(int argc , char *argv[])
{
//参数校验
if(argc < 3)
{
perror("argument error ... ");
return -1 ;
}
struct stat state ;
stat(argv[argc-1] , &state);
//如果最后一个参数不是目录的话报错退出
if(!S_ISDIR(state.st_mode))
{
fprintf(stderr , "the last one is not a directory ... \n");
return -2 ;
}
int i ;
char buffer[256] = {0};
for(i = 1 ; i < argc-1 ; i++)
{
// printf("argv[%d]:%s\n" , i , argv[i]);
stat(argv[i] , &state);
if(S_ISREG(state.st_mode)) //判断参数是否为单独的文件
{
sprintf(buffer , "%s/%s" , argv[argc-1] , argv[i]);
//拷贝文件
copy_file(argv[i] , buffer);
continue ;
}
if(S_ISDIR(state.st_mode)) //判断参数是否为目录
{
//拷贝文件夹
copy_directory(argv[i] , argv[argc-1] , argv[i]);
continue ;
}
}
return 0 ;
}
void copy_file(const char *src , const char *dest)
{
int src_fd ;
int dest_fd ;
src_fd = open(src , O_RDONLY);
if(-1 == src_fd)
{
perror("mycy srcfile error");
return ;
}
char ch ;
dest_fd = open(dest , O_WRONLY | O_CREAT | O_EXCL , 0777);
if(dest_fd < 0)
{
//文件存在,判断是否覆盖
printf("Over write ? Y/N\n");
ch = getchar();
if((ch == 'Y') || (ch == 'y'))
{
close(dest_fd);
dest_fd = open(dest , O_WRONLY | O_TRUNC);
}else
{
return ;
}
}
//文件不存在,直接创建成功
char buffer[10] = {0} ;
int ret ;
while(1)
{
ret = read(src_fd , buffer , 10);
write(dest_fd , buffer , ret);
if(ret != 10)
break;
}
close(dest_fd);
close(src_fd);
}
void copy_directory(const char *src , const char *dest , const char *name)
{
char buffer[265] = {0};
char tmpbuffer[256] = {0};
char tmpbuffer1[256] = {0};
sprintf(buffer , "%s/%s" , dest , name);
int ret ;
struct stat state ;
DIR *dir = NULL ;
struct dirent *entry = NULL ;
ret = stat(buffer , &state);
if(ret == -1)
{
//目录不存在,copy
ret = mkdir(buffer , 0777);
printf("ret:%d buffer:%s\n" , ret , buffer);
dir = opendir(src);
if(NULL == dir)
{
perror("open dir error");
return ;
}
while(1)
{
entry = readdir(dir);
if(NULL == entry)
break;
if((strcmp(entry->d_name , ".")==0)||(strcmp(entry->d_name , "..")==0))
continue ;
sprintf(tmpbuffer , "%s/%s" , buffer , entry->d_name);
sprintf(tmpbuffer1 , "%s/%s" , src , entry->d_name);
stat(tmpbuffer1 , &state);
if(S_ISREG(state.st_mode))
{
copy_file( tmpbuffer1 , tmpbuffer);
}
if(S_ISDIR(state.st_mode))
{
copy_directory(tmpbuffer1 , buffer , entry->d_name);
printf("*********** %s -> %s \n" , tmpbuffer1 , buffer);
}
}
}
}