Linux cp命令实现将多个文件复制到目录

时间:2017-05-20 09:09:13

标签: c linux cp

我目前正在学习系统编程,并在C中遇到了Linux cp命令的实现。虽然从我的理解,这个实现允许将一个文件的内容复制到同一目录中的另一个文件,并且还复制一个将文件存入当前目录中的目录。

如何更改此代码以允许一次将多个文件复制到目录中(即" copy f1.txt f2.txt f3.txt / dirInCurrentDir") 或者甚至("复制d1 / d2 / d3 / f1 d4 / d5 / d6 / f2 d")将2个文件复制到目录d。我知道更改必须在main()中进行,但是如何添加到if-else语句?

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>

#define BUFFERSIZE 1024
#define COPYMORE 0644

void oops(char *, char *);
int copyFiles(char *src, char *dest);
int dostat(char *filename);
int mode_isReg(struct stat info);


int main(int ac, char *av[])
{
  /* checks args */
  if(ac != 3)
  {
    fprintf(stderr, "usage: %s source destination\n", *av);
    exit(1);
  }


   char *src = av[1];
   char *dest = av[2];


   if( src[0] != '/' && dest[0] != '/' )//cp1 file1.txt file2.txt
   {
       copyFiles(src, dest);
   }
   else if( src[0] != '/' && dest[0] == '/' )//cp1 file1.txt /dir 
   {
      int i;
      for(i=1; i<=strlen(dest); i++)
      {
          dest[(i-1)] = dest[i];
      }
      strcat(dest, "/");
      strcat(dest, src);


      copyFiles(src, dest);
  }

  else
  {
      fprintf(stderr, "usage: cp1 source destination\n");
      exit(1);
  }
}



int dostat(char *filename)
{
    struct stat fileInfo;

    //printf("Next File %s\n", filename);
    if(stat(filename, &fileInfo) >=0)
    if(S_ISREG(fileInfo.st_mode))
    return 1;
    else return 0;

    return;
}




int copyFiles(char *source, char *destination)
{
  int in_fd, out_fd, n_chars;
  char buf[BUFFERSIZE];


  /* open files */
  if( (in_fd=open(source, O_RDONLY)) == -1 )
  {
    oops("Cannot open ", source);
  }


  if( (out_fd=creat(destination, COPYMORE)) == -1 )
  {
    oops("Cannot create ", destination);
  }


  /* copy files */
  while( (n_chars = read(in_fd, buf, BUFFERSIZE)) > 0 )
  {
    if( write(out_fd, buf, n_chars) != n_chars )
    {
      oops("Write error to ", destination);
    }


    if( n_chars == -1 )
    {
      oops("Read error from ", source);
    }
  }


    /* close files */
    if( close(in_fd) == -1 || close(out_fd) == -1 )
    {
      oops("Error closing files", "");
    }


    return 1;
}


  void oops(char *s1, char *s2)
  {
    fprintf(stderr, "Error: %s ", s1);
    perror(s2);
    exit(1);
  }

1 个答案:

答案 0 :(得分:0)

您将循环遍历所有参数值(从av [1]到av [ac - 2])并将其复制到目标参数,即av [ac - 1]。

在你的情况下,你会将av [i]和av [ac - 1]传递给copyFiles函数,在那里我将成为你的循环索引。