C 我如何传递将一个目录的文件复制到另一个目录的功能的路径

C 我如何传递将一个目录的文件复制到另一个目录的功能的路径,c,linux,readdir,opendir,C,Linux,Readdir,Opendir,我试图用opendir和readdir将文件从一个目录复制到一个现有目录,但当我执行代码时,我的copie函数中出现了open failed错误,我不理解,因为我的x是一个字符*,当我打印它时,它给了我正确的文件,我也不知道如何创建一个新目录的路径,在那里我要复制我的文件。如果有人能帮忙。谢谢 #包括 #包括 #包括 #包括 #包括 #包括 #包括 无效副本(字符*源,字符*目的) { /*第1版*/ //创建缓冲区(4096)。 char-buf[4096]; //你需要一个生活和恢

我试图用opendir和readdir将文件从一个目录复制到一个现有目录,但当我执行代码时,我的copie函数中出现了open failed错误,我不理解,因为我的x是一个字符*,当我打印它时,它给了我正确的文件,我也不知道如何创建一个新目录的路径,在那里我要复制我的文件。如果有人能帮忙。谢谢


#包括
#包括
#包括
#包括
#包括
#包括
#包括
无效副本(字符*源,字符*目的)
{   
/*第1版*/
//创建缓冲区(4096)。
char-buf[4096];
//你需要一个生活和恢复的空间。
int fs=开放(仅限源代码);
//这是一个非常有趣的故事。
//在不存在的情况下,Avec参数的设计和创建。
int fd=开放(目的地,仅为目的地,为目的地创建,为目的地不包括目的地,为目的地追加,0666);
//在菲舍尔一里尔的城堡里进行测试。
如果(fs==-1){
printf(“\n open()失败\n”);
出口(1);
}
//第二节课阅读有关缓冲区和缓冲区尾部的参数。
int size=read(fs,buf,sizeof(buf));
// EcReTueAVEC写EN LUI通行证参数L'ID DuFICHIER A ECRCRE LE缓冲器。
写入(fd、buf、大小);
//测试菲希尔的财务状况。
buf[4096]='\0';
//倾倒测试:printf(“缓冲区:%s”,buf);
/*ETAPE 2*/
结构统计状态;
//FSTAT RePa'Re't'Tu'Du'Fuffier-Posier-Par Par Le描述勒唐蓬FSet。
财政司司长(财政司司长及法定人数);
//fchmod修改了菲舍尔fd的访问权,以确保文件的完整性。
fchmod(fd,状态st_模式);
//菲舍尔酒店。
关闭(fd);
关闭(fs);
}
作废副本权限(char*rsource,char*rdest)
{
DIR*rs=opendir(rsource);
DIR*rd=opendir(rdest);
结构方向*sd;
如果(rs==NULL | | rd==NULL){
printf(“Opendir()失败”);
出口(1);
}
而((sd=readdir(rs))!=NULL){
printf(“瞧%s”,sd->d_名称);
如果(sd->d_type==DT_REG){
char*x=sd->d_名称;
printf(“瞧%s”,x);
//副本(x,“rdest”/;
}   
}
closedir(rs);
closedir(rd);;
}
int main(int argc,char*argv[])
{
复印件(“tes.txt”、“tese.txt”);
副专利(“资源”、“资源”);
}

你应该
在一个循环中,直到没有更多的东西可读为止。设置
buf[4096]='\0'
没有用。此外,当索引从0..n-1开始时,这应该是4095。如果我没记错,那么
readdir
将为您提供没有路径的文件名。您应该为copie提供完整路径+文件名。您可以将完整路径+文件名创建为:
char buf[256];sprintf(buf,“%s\\%s”,路径,文件)
@PaulOgilvie问题是我用sd->d_name恢复了文件名,所以我把它放在一个变量x中,并把它交给copie,它给了我打开文件失败的机会,我尝试了rsource/x,但问题是相同的,所以你应该使用
sprintf(buf,“%s/%s”,rsource,sd->d_name)
并打印它,确保它是完整路径,然后检查文件是否位于该路径。
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <dirent.h>


void copie (char* source, char* dest)
{   
    /* ETAPE 1 */

    //Creation du buffer de taille 4096.
    char buf [4096];

    //Ouverture du fichier a lire et recuperation de son Id fs.
    int fs=open(source, O_RDONLY);

    //Ouverture du fichier a écrire et recuperation de son Id fd.
    //Avec parametres de gestion d'erreur et creation de ce fichier si il n'existe pas.
    int fd=open(dest, O_WRONLY|O_CREAT|O_EXCL|O_APPEND, 0666);

    //Test en cas d'échec l'ouverture du fichier a lire.
    if (fs==-1) {
    printf("\n open() failed \n");
    exit(1);
    }

    //Lecture avec read en lui passant en parametre l'Id du fichier a lire le buffer et la taille du buffer.
    int size = read (fs,buf,sizeof(buf));

    //Ecriture avec write en lui passant en parametre l'Id du fichier a écrire le buffer et la taille du fichier récupéré par read.
    write (fd,buf,size);

    //Test de fin du fichier.
    buf[4096]= '\0';

    //Pour le test: printf ("buffer: %s", buf);

    /* ETAPE 2 */

    struct stat statut;
    //fstat récupère l'état du fichier pointé par le descripteur fs et remplit le tampon statut. 
    fstat(fs,&statut); 
    //fchmod modifie les droit d'acces du fichier fd, tels qu'ils soient les meme que ceux de fs.
    fchmod(fd,statut.st_mode);

    //Fermeture des fichiers.
    close (fd);
    close (fs);
}

void copieRepertoire (char* rsource, char* rdest)
{
    DIR *rs = opendir(rsource);
    DIR *rd = opendir(rdest);
    struct dirent *sd;

    if (rs == NULL || rd == NULL){
    printf("Opendir() failed");
    exit(1);
    }

    while ((sd=readdir(rs)) != NULL){
        printf(" voila %s", sd ->d_name);
        if (sd ->d_type == DT_REG) {
        char *x = sd -> d_name;
    printf(" voila %s", x);
        // copie (x,"rdest"/???);       
    }   
    }
    closedir(rs);
    closedir(rd);   
}

int main(int argc, char *argv[])
{

    copie("tes.txt","tese.txt");
    copieRepertoire ("rsource","rdest");

}