如何在Linux中使用C将所有文件从一个文件夹复制到另一个文件夹

如何在Linux中使用C将所有文件从一个文件夹复制到另一个文件夹,c,C,我想在Linux上使用C将所有文件从一个特定文件夹复制到另一个文件夹 它可以工作;但是,目标文件夹的文件数少于源文件夹 我不知道我做错了什么。有人能帮我修一下吗 这是我的代码: #include <sys/stat.h> #include <sys/types.h> #include <dirent.h> #include <fcntl.h> #include <unistd.h> #include <stdio.h> #i

我想在Linux上使用C将所有文件从一个特定文件夹复制到另一个文件夹

它可以工作;但是,目标文件夹的文件数少于源文件夹

我不知道我做错了什么。有人能帮我修一下吗

这是我的代码:

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

int main (int argc, char *argv[])
{
   if (argc!=3)
   {
      printf("USAGE: programname source destination\n");
      return 1;
   }

   DIR *srcPtr;

   if (mkdir(argv[2],0777)<0)
   {
      printf("Unable to create directory %s (probably it already exists)\n",argv[2]);
   }
   srcPtr=opendir(argv[1]);
   if (srcPtr==NULL)
   {
      printf("BAD OPENDIR %s\n",argv[1]);
      return 1;
   }

   struct dirent *dirPtr;
   struct stat statbuff;
   int fdSrc,fdDest;
   char *path_copia;
   unsigned int len_path_copia;
   unsigned char c;

   chdir(argv[1]);
   while ( (dirPtr=readdir(srcPtr)) !=NULL)
   {
      if (lstat(dirPtr->d_name,&statbuff)<0)
      {
         printf("BAD LSTAT\n");
         return 1;
      }
      if (S_ISREG(statbuff.st_mode))
          //IT's A REGULAR FILE WITH EXECUTION rights for the owner
      {
         //COPY----
         len_path_copia=strlen(argv[2]);
         len_path_copia+=1+strlen(dirPtr->d_name);
         path_copia=(char *)malloc(len_path_copia*sizeof(char));

         strcpy(path_copia,argv[2]);
         strcat(path_copia,dirPtr->d_name);
         printf("Copying %s in %s\n",dirPtr->d_name,path_copia);
         if ( (fdDest=open(path_copia,O_CREAT|O_TRUNC|O_WRONLY,(statbuff.st_mode &S_IRWXU)|(statbuff.st_mode &S_IRWXG)|(statbuff.st_mode &S_IRWXO) ) ) <0 )
         {
            printf("BAD OPEN %s\n",path_copia);
            return 1;
         }
         if ( (fdSrc=open(dirPtr->d_name,O_RDONLY))<0 )
         {
            printf("BAD OPEN %s\n",dirPtr->d_name);
            return 1;
         }
         while (read(fdSrc,&c,1)==1)
         {
            write(fdDest,&c,1);
         }
         close(fdSrc);
         close(fdDest);
         free(path_copia);
      }

   }
   chdir("..");
   closedir (srcPtr);
   return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
如果(argc!=3)
{
printf(“用法:程序名源目标\n”);
返回1;
}
DIR*srcPtr;

如果(mkdir(argv[2],0777)d_name,&statbuff)首先,我想指出这个程序确实有问题。我认为还有很多经过良好测试的替代方案(rsync?),所以我只能假设您编写这个程序是为了学习c。在这种情况下,有很多东西需要学习,但这是一个伟大的第一个成就:)

无论如何,我编译了您的代码并发现了一些问题:

  • 例如,如果我运行copycmd/tmp/tst1//tmp/tst2/,首先创建/tmp/tst2,然后将可执行文件chdirs转换为/tmp/tst1,然后尝试打开tst2/file1,它基本上是/tmp/tst1/tst2/file1。由于/tmp/tst1/tst2文件夹不存在,因此失败。我使用保存sourceFilename的sourceFilename变量修复了这一问题(与path_copia相同,但用于argv[1]),并使用它代替dirPtr->d_name
  • 如果不以/结束第一个参数,则exe无法正常工作(尝试打开/tmp/tst1。而不是/tmp/tst1)。您应该尝试自己修复此问题
  • 第二个参数也是如此,但以不同的方式断开(/tmp/tst2filename而不是/tmp/tst2/filename)
对于导致文件减少的问题,我认为问题是因为您认为它应该写入到./argv[2],它实际上写入到./argv[1]/argv[2]/

修复后的最终结果:

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

int main (int argc, char *argv[])
{
   if (argc!=3)
   {
      printf("USAGE: programname source destination\n");
      return 1;
   }

   DIR *srcPtr;

   if (mkdir(argv[2],0777)<0)
   {
      printf("Unable to create directory %s (probably it already exists)\n",argv[2]);
   }
   srcPtr=opendir(argv[1]);
   if (srcPtr==NULL)
   {
      printf("BAD OPENDIR %s\n",argv[1]);
      return 1;
   }

   struct dirent *dirPtr;
   struct stat statbuff;
   int fdSrc,fdDest;
   char *path_copia;
   char *sourceFileName;
   unsigned int len_path_copia;
   unsigned int len_sourceFileName;
   unsigned char c;

//   chdir(argv[1]);
   while ( (dirPtr=readdir(srcPtr)) !=NULL)
   {
      len_sourceFileName = strlen(argv[1]);
      len_sourceFileName += 1+strlen(dirPtr->d_name);
      sourceFileName = malloc(len_sourceFileName*sizeof(char));
      strcpy(sourceFileName,argv[1]);
      strcat(sourceFileName,dirPtr->d_name);

      if (lstat(sourceFileName,&statbuff)<0)
      {
         printf("BAD LSTAT (%s)\n", sourceFileName);
         return 1;
      }
      if (S_ISREG(statbuff.st_mode))
          //IT's A REGULAR FILE WITH EXECUTION rights for the owner
      {
         //COPY----
         len_path_copia=strlen(argv[2]);
         len_path_copia+=1+strlen(dirPtr->d_name);
         path_copia=(char *)malloc(len_path_copia*sizeof(char));

         strcpy(path_copia,argv[2]);
         strcat(path_copia,dirPtr->d_name);
         printf("Copying %s in %s\n",sourceFileName,path_copia);
         if ( (fdDest=open(path_copia,O_CREAT|O_TRUNC|O_WRONLY,(statbuff.st_mode &S_IRWXU)|(statbuff.st_mode &S_IRWXG)|(statbuff.st_mode &S_IRWXO) ) ) <0 )
         {
            printf("BAD OPEN %s\n",path_copia);
            return 1;
         }
         if ( (fdSrc=open(sourceFileName,O_RDONLY))<0 )
         {
            printf("BAD OPEN %s\n", sourceFileName);
            return 1;
         }
         while (read(fdSrc,&c,1)==1)
         {
            write(fdDest,&c,1);
         }
         close(fdSrc);
         close(fdDest);
         free(path_copia);
      }

   }
//   chdir("..");
   closedir (srcPtr);
   return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
如果(argc!=3)
{
printf(“用法:程序名源目标\n”);
返回1;
}
DIR*srcPtr;
if(mkdir(argv[2],0777)d_name);
sourceFileName=malloc(len_sourceFileName*sizeof(char));
strcpy(sourceFileName,argv[1]);
strcat(sourceFileName,dirPtr->d_name);

如果(lstat(sourceFileName,&statbuff)首先,我想指出这个程序确实有问题。我认为还有很多经过良好测试的替代方案(rsync?),所以我只能假设您编写这个程序是为了学习c。在这种情况下,有很多东西需要学习,但这是一个伟大的第一个成就:)

无论如何,我编译了您的代码并发现了一些问题:

  • 例如,如果我运行copycmd/tmp/tst1//tmp/tst2/,首先创建/tmp/tst2,然后将可执行文件chdirs转换为/tmp/tst1,然后尝试打开tst2/file1,它基本上是/tmp/tst1/tst2/file1。由于/tmp/tst1/tst2文件夹不存在,因此失败。我使用保存sourceFilename的sourceFilename变量修复了这一问题(与path_copia相同,但用于argv[1]),并使用它代替dirPtr->d_name
  • 如果不以/结束第一个参数,则exe无法正常工作(尝试打开/tmp/tst1。而不是/tmp/tst1)。您应该尝试自己修复此问题
  • 第二个参数也是如此,但以不同的方式断开(/tmp/tst2filename而不是/tmp/tst2/filename)
对于导致文件减少的问题,我认为问题是因为您认为它应该写入到./argv[2],它实际上写入到./argv[1]/argv[2]/

修复后的最终结果:

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

int main (int argc, char *argv[])
{
   if (argc!=3)
   {
      printf("USAGE: programname source destination\n");
      return 1;
   }

   DIR *srcPtr;

   if (mkdir(argv[2],0777)<0)
   {
      printf("Unable to create directory %s (probably it already exists)\n",argv[2]);
   }
   srcPtr=opendir(argv[1]);
   if (srcPtr==NULL)
   {
      printf("BAD OPENDIR %s\n",argv[1]);
      return 1;
   }

   struct dirent *dirPtr;
   struct stat statbuff;
   int fdSrc,fdDest;
   char *path_copia;
   char *sourceFileName;
   unsigned int len_path_copia;
   unsigned int len_sourceFileName;
   unsigned char c;

//   chdir(argv[1]);
   while ( (dirPtr=readdir(srcPtr)) !=NULL)
   {
      len_sourceFileName = strlen(argv[1]);
      len_sourceFileName += 1+strlen(dirPtr->d_name);
      sourceFileName = malloc(len_sourceFileName*sizeof(char));
      strcpy(sourceFileName,argv[1]);
      strcat(sourceFileName,dirPtr->d_name);

      if (lstat(sourceFileName,&statbuff)<0)
      {
         printf("BAD LSTAT (%s)\n", sourceFileName);
         return 1;
      }
      if (S_ISREG(statbuff.st_mode))
          //IT's A REGULAR FILE WITH EXECUTION rights for the owner
      {
         //COPY----
         len_path_copia=strlen(argv[2]);
         len_path_copia+=1+strlen(dirPtr->d_name);
         path_copia=(char *)malloc(len_path_copia*sizeof(char));

         strcpy(path_copia,argv[2]);
         strcat(path_copia,dirPtr->d_name);
         printf("Copying %s in %s\n",sourceFileName,path_copia);
         if ( (fdDest=open(path_copia,O_CREAT|O_TRUNC|O_WRONLY,(statbuff.st_mode &S_IRWXU)|(statbuff.st_mode &S_IRWXG)|(statbuff.st_mode &S_IRWXO) ) ) <0 )
         {
            printf("BAD OPEN %s\n",path_copia);
            return 1;
         }
         if ( (fdSrc=open(sourceFileName,O_RDONLY))<0 )
         {
            printf("BAD OPEN %s\n", sourceFileName);
            return 1;
         }
         while (read(fdSrc,&c,1)==1)
         {
            write(fdDest,&c,1);
         }
         close(fdSrc);
         close(fdDest);
         free(path_copia);
      }

   }
//   chdir("..");
   closedir (srcPtr);
   return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
如果(argc!=3)
{
printf(“用法:程序名源目标\n”);
返回1;
}
DIR*srcPtr;
if(mkdir(argv[2],0777)d_name);
sourceFileName=malloc(len_sourceFileName*sizeof(char));
strcpy(sourceFileName,argv[1]);
strcat(sourceFileName,dirPtr->d_name);

如果(lstat(sourceFileName,&statbuff)嗯,这是我迄今为止看到的复制文件的最笨拙的方式。复制字节方式,你是认真的吗?嗯,这是我迄今为止看到的复制文件的最笨拙的方式。复制字节方式,你是认真的吗?