如何在Linux中使用C将所有文件从一个文件夹复制到另一个文件夹
我想在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
#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)嗯,这是我迄今为止看到的复制文件的最笨拙的方式。复制字节方式,你是认真的吗?嗯,这是我迄今为止看到的复制文件的最笨拙的方式。复制字节方式,你是认真的吗?