我目前正在学习系统编程,在C语言中遇到了Linux cp命令的一个实现。尽管据我所知,这个实现允许将一个文件的内容复制到同一目录中的另一个文件,也可以将一个文件复制到当前目录中的一个目录中。
如何更改此代码以允许同时将多个文件复制到一个目录(即“copy f1.txt f2.txt f3.txt/diringeneratdir”)
或者甚至(“copy d1/d2/d3/f1 d4/d5/d6/f2 d”)将这两个文件复制到目录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);
  }

最佳答案

您将遍历所有参数值(从av[1]到av[ac-2]),并将其复制到目标参数av[ac-1]。
在您的例子中,您将把av[i]和av[ac-1]传递给copyFiles函数,在这里我将是您的循环索引。

关于c - Linux cp命令实现将多个文件复制到目录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44084005/

10-13 08:11