linux+cp命令代码,Linux 命令 "cp" 代码实现简介

main.c

/*********************************************************

* File name:

* Description:

* Author: Jimmy_Nie

* Version Modify Time

* v1.0 creat 2017-09-12

*

*********************************************************/

#include "copy_file.h"

int main(int argc, char *argv[])

{

//Check the arguments

if( 3 != argc)

{

printf("%s(%d): arguments error!\n",__FILE__, __LINE__);

exit(EXIT_FAILURE);

}

//check the source file is a file or a directory

struct stat src_stat;

//destination file check

struct stat dest_stat;

//If source is a file

if( FILES == check_file(argv[1], &src_stat) )

{

FILE_ENUM dest_enum;

dest_enum = check_file( argv[2], &dest_stat );

char cmd[100] = "";

char ch;

switch(dest_enum)

{

case NOT_EXIST:

sprintf(cmd, "touch %s", argv[2]);

system( cmd );

check_file( argv[2], &dest_stat );

cp_file(argv[1], argv[2], &dest_stat);

break;

case DIRECTORY:

cp_file(argv[1], argv[2], &dest_stat);

break;

case FILES:

fprintf(stdout, "Overwrite the dest file %s, [y/n]\n", argv[2]);

ch = getchar();

if( ch == 'Y' || ch == 'y' )

{

cp_file(argv[1], argv[2], &dest_stat);

}

else

exit(0);

break;

default:

fprintf(stderr, "%s(%d): file type error\n", __FILE__, __LINE__);

}

}

//If source file is a directory

else if( DIRECTORY == check_file(argv[1], &dest_stat) )

{

FILE_ENUM dest_enum;

dest_enum = check_file( argv[2], &dest_stat );

char cmd[100] = "";

switch(dest_enum)

{

case NOT_EXIST:

sprintf(cmd, "mkdir -p %s", argv[2]);

system( cmd );

cp_dir(argv[1], argv[2] );

break;

case DIRECTORY:

cp_dir(argv[1], argv[2]);

break;

case FILES:

fprintf(stderr, "Can't copy a directory to a file\n");

exit(EXIT_FAILURE);

break;

default:

fprintf(stderr, "%s(%d): file type error\n", __FILE__, __LINE__);

break;

}

}

return 0;

}

copy.c

#include "copy_file.h"

FILE_ENUM check_file(char *var, struct stat *st)

{

if( stat(var, st) ) //if stat function error(renturn nonzero)

{

if( ENOENT == errno) //No such file or directory

{

return NOT_EXIST;

}

else

{

perror("stat");

exit(EXIT_FAILURE);

}

}

else // stat() ok, no error

{

//check file attr(dir or file)

if( S_ISDIR(st->st_mode ))

return DIRECTORY;

else if( S_ISREG(st->st_mode) )

return FILES;

else

{

fprintf(stderr, "%s(%d):file type error", __FILE__ , __LINE__);

exit(EXIT_FAILURE);

}

}

}

//-----------------------------------------------------

int cp_file(char *src_var, char *dest_var, struct stat *st)

{

FILE *src = NULL;

FILE *dest = NULL;

if( S_ISREG(st->st_mode) ) //if dest is file

{

//1. open src and dest file

if( NULL == (src = fopen(src_var, "r")) )

{

perror("fopen");

exit(EXIT_FAILURE);

}

if( NULL == (dest = fopen(dest_var, "w+")) )

{

perror("fopen");

exit(EXIT_FAILURE);

}

//2. copy the context from src to dest

char buf[1024];

int num;

while(1)

{

// if at the end of file or an error occured

if( 1024 != (num = fread(buf, 1,1024, src)))

{

if( !feof(src))

{

perror("fread");

exit(EXIT_FAILURE);

}

else

{

fwrite(buf, 1, num, dest);

fclose(dest); //3. close dest file

break;

}

}

fwrite(buf, 1, 1024, dest);

}

//3. close src file

fclose(src);

return 0;

}

if( S_ISDIR(st->st_mode) )

{

char buf[100]="";

//make the relative path to absolute path

strncpy(buf, dest_var, sizeof(dest_var));

strcat(buf, src_var);

//if dest file doesn't exist, creat it first

char cmd[100]="";

sprintf(cmd, "touch %s",buf);

system(cmd);

struct stat new_dest_stat;

if( stat(buf, &new_dest_stat))

{

perror("stat");

exit(EXIT_FAILURE);

}

cp_file(src_var, buf, &new_dest_stat);

}

return 0;

}

//----------------------------------------------

//if src file is a dir

int cp_dir(char *src, char *dest)

{

DIR *dirp = NULL;

//1. open the dir

if( NULL == (dirp = opendir(src)) )

{

perror("opendir");

exit(EXIT_FAILURE);

}

struct dirent *entp = NULL;

//2. read the dir

while( NULL != (entp = readdir(dirp))) //read the dir context

{

if( 0 == (strcmp(entp->d_name,"..")) || 0 == (strcmp(entp->d_name, ".")))

{

continue;

}

char src_buf[100] = "";

char dest_buf[100] = "";

sprintf(src_buf, "%s/%s\0", src, entp->d_name);

sprintf(dest_buf, "%s/%s\0", dest, entp->d_name);

struct stat src_stat;

if( stat(src_buf,&src_stat) )

{

perror("stat");

exit(EXIT_FAILURE);

}

if( S_ISREG(src_stat.st_mode) )

{

cp_file(src_buf, dest_buf, &src_stat);

}

else if( S_ISDIR(src_stat.st_mode) )

{

if( -1 == mkdir(dest_buf, src_stat.st_mode) )

{

perror("mkdir");

exit(EXIT_FAILURE);

}

cp_dir(src_buf, dest_buf); //if subdir, recursive call itself

}

}

return 0;

}

copy.h

#ifndef _COPY_H_

#define _COPY_H_

#include

#include

#include

#include

#include

#include

#include

#include

typedef enum

{

NOT_EXIST=1,

DIRECTORY,

FILES

}FILE_ENUM;

extern FILE_ENUM check_file(char *var, struct stat *st); //检查文件类型

extern int cp_file(char *src_var, char *dest_var, struct stat *st); //copy文件

extern int cp_dir(char *src, char *dest); //copy目录

#endif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值