2 votes

Copier plusieurs fichiers en C

Je rencontre un problème lorsque j'essaie de copier plusieurs fichiers en C. Il copie le premier fichier dans le répertoire, mais pas les autres. Les autres fichiers ne sont même pas ouverts et je ne sais pas d'où vient le problème. Une idée ?

bool copyFileToDirectory(char *file, char *directory){
    int input_fd, output_fd;
    ssize_t ret_in, ret_out;
    char* buffer[2048];
    struct stat fileStat;

    /* Vérifier les autorisations */
    access(directory, W_OK);
    if(errno == EACCES) {
        perror("Le fichier de sortie n'est pas accessible en écriture");
        return false;
    }
    if(errno == EROFS) {
        perror("Le fichier de sortie n'est pas accessible en écriture (lecture seule)");
        return false;
    }
    int rval = access(file, R_OK);
    if(rval != 0) {
        printf("Le fichier d'entrée n'est pas lisible (accès refusé)\n");
        return false;
    }

    /* Copie */
    input_fd = open(file, O_RDONLY);
    stat(file, &fileStat);

    chdir(directory);

    output_fd = open(file, O_WRONLY | O_CREAT | O_TRUNC, 0666);
    chmod(file, fileStat.st_mode);

    while((ret_in = read(input_fd, &buffer, 2048)) > 0){
        ret_out = write(output_fd, &buffer, (ssize_t) ret_in);
        if(ret_out != ret_in){
            perror("Une erreur s'est produite lors du processus\n");
            return false;
        }
    }

    close(input_fd);
    close(output_fd);

    return true;

}

0voto

Jose L Molina Points 326

Pour résoudre le problème, j'ai ajouté les lignes suivantes :

    char cwd[1024];
    getcwd(cwd, 1024);

Avec cela, j'ai obtenu l'adresse du répertoire de travail actuel.

Et plus tard,

    chdir(cwd);

Nous devons revenir pour les copies ultérieures.

Code final:

bool copyToDirectory(char *file, char *directory){
    char cwd[1024];
    getcwd(cwd, 1024);
    int input_fd, output_fd;
    ssize_t ret_in, ret_out;
    char* buffer[2048];
    struct stat fileStat;

    /* Vérifier les autorisations */
    access (directory, W_OK);
    if (errno == EACCES) {
        perror("Le fichier de sortie n'est pas accessible en écriture");
        return false;
    }
    if (errno == EROFS) {
        perror("Le fichier de sortie n'est pas accessible en écriture (lecture seule)");
        return false;
    }
    int rval = access (file, R_OK);
    if (rval != 0) {
        printf ("Le fichier d'entrée n'est pas accessible en lecture (accès refusé)\n");
        return false;
    }

    /* Copier */
    input_fd = open (file, O_RDONLY);
    stat(file, &fileStat);

    chdir(directory);

    output_fd = open(file, O_WRONLY | O_CREAT | O_TRUNC, 0666);
    chmod(file, fileStat.st_mode);

    while((ret_in = read (input_fd, &buffer, 2048)) > 0){
        ret_out = write (output_fd, &buffer, (ssize_t) ret_in);
        if(ret_out != ret_in){
            perror("Une erreur s'est produite pendant le processus\n");
            return false;
        }
    }

    close(input_fd);
    close(output_fd);

    chdir(cwd);

    return true; 
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X