如何将路径传递到函数以将目录文件复制到另一个目录

时间:2019-11-09 12:15:24

标签: c linux readdir opendir

我正在尝试使用opendir和readdir将文件从目录复制到现有目录,但是当我执行我的代码时,我在copie函数中遇到打开失败错误,我不明白是因为我的x是char *以及何时我打印它会给我正确的文件,而且我也不知道如何创建要复制文件的新目录的路径。如果有人可以帮助。谢谢。


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

}

0 个答案:

没有答案