Как я могу передать путь к моей функции, чтобы скопировать файлы каталога в другой каталог - PullRequest
0 голосов
/ 09 ноября 2019

Я пытаюсь скопировать файлы из каталога в существующий каталог с помощью opendir и readdir, но когда я выполняю свой код, у меня возникает ошибка открытого сбоя в функции копирования, я не понимаю, потому что мой x - это символ *, и когдая печатаю его, он дает мне нужный файл, и я также не знаю, как сделать путь к новому каталогу, куда я хочу скопировать мои файлы. если кто-то может помочь. Спасибо.


.

#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");

}
...