C语言实现Linux cp命令

1.分析所需功能

  1. 文件到文件(参数:两个文件名)
    1.文件到文件的复制
    2.文件到文件的硬链接(-l)
    3.文件到文件的软链接(-s)
  2. 文件到目录(参数:一个文件名,一个目录名)
    1.文件到目录的复制
    2.新目录下建立文件硬链接(-l)
    3.新目录下建立文件软链接(-s)
  3. 目录到目录
    1.目录的递归复制(-r)

2. 功能函数的实现

  1. 文件到文件的复制

    copyF2F(char * src, char *dst)
    {
         int in_fd, out_fd, n_chars;
         char buf[BUFFERSIZE];
    
        /*如果目标文件是一个目录,那么默认是在该目录下建立一个与源文件同名的文件*/
        if (isdir(dest_file)) 
        {    
            char c;
            char temp[10] = { '\0' };
            char *r_temp;
            int n = strlen(src_file);
            int m = 0;
    
            /*读取源文件的最后一级文件名作为目标文件名*/
            while ((c = src_file[n - 1]) != '/') 
            {
                temp[m] = c;
                m++;
                n--;
            }
             r_temp = strrev(temp);
            strcat(dest_file, r_temp);
       }
    }
  2. 为文件建立硬链接

    link(src, dst)
  3. 为文件建立软链接
smlink(src, dst)

4.目录到目录的复制
“`
int copyD2D(char *src_dir, char *dest_dir)
{
DIR *dp = NULL;
struct dirent *dirp;
char tempDest[256];
char tempSrc[256];
strcpy(tempDest, dest_dir);
strcpy(tempSrc, src_dir);

/*使用opendir函数打开src_dir目录,获得指向该目录名字的指针*/
if ((dp = opendir(src_dir)) == NULL)
    return 1;
else
{    
    /*使用readdir函数读取dp所指代目录的目录项,获得指向下一个dirent结构的指针*/
    while ((dirp = readdir(dp)))
    {
        struct stat file_stat;
        if (!isdir(dirp->d_name))
        {    
            /*将dirent结构中的d_name成员变量链接到上级目录字符串*/
            strcat(tempDest, dirp->d_name);
            strcat(tempSrc, dirp->d_name);

            /*此处转换为文件复制函数的方式处理目录复制*/
            copyF2F(tempSrc, tempDest);

            /*通过字符串拷贝函数,将tempDest和tempSrc还原为上级的目录名*/
            strcpy(tempDest, dest_dir);
            strcpy(tempSrc, src_dir);
        }
    }
     /*关闭目录*/
    closedir(dp);
    return 0;
}

“`

你可能感兴趣的:(Linux)