Problema al copiar archivos en C

Iniciado por Frijolito, Febrero 14, 2019, 12:40:13 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Hola tengo un pequeno problema, estoy haciendo un programa que copie todos los archivos de un pendrive al ser conectado y funciona la deteccion pero al intentar copiar el archivo no funciona, se crea el archivo pero no recibe la información les dejo el codigo para que prueben.

Código: c
#include <stdlib.h>
#include <stdio.h>
#include <dirent.h>
#include <sys/types.h>
#include <string.h>
#include <windows.h>

void Copia(char *archivo, char *n_dir);

int main(){

DIR *dirE,*dirF,*dirG,*dirH, *dir ;

char *files;
char *n_dir;
struct dirent *ent;
int i = 1;

while( free ){
dirE = opendir("E:");
dirF = opendir("F:");
dirG = opendir("G:");
dirH = opendir("H:");
if(dirE != NULL){
n_dir = "E:/";
dir = dirE;
break;
}
if(dirF != NULL){
n_dir = "F:/";
dir = dirF;
break;
}
if(dirG != NULL){
n_dir = "G:/";
dir = dirG;
break;
}
if(dirH != NULL){
n_dir = "H:/";
dir = dirH;
break;
}
printf(" [!!] No se a encontrado el pendrive. \n" );
Sleep(500);
}

while( (ent = readdir(dir)) != NULL ){
if( (strcmp(ent->d_name,".")!=0) && (strcmp(ent->d_name,"..")!=0) ){
printf( "  %i-.%s \n",i ,ent->d_name );
i++;
files = ent->d_name;
Copia(files, n_dir);
}
}

return 0;
}

void Copia(char *archivo, char *n_dir){

char archivo2[200] = "C:/Users/jm_ra/Documents/Copias/Copia-";

strcat( archivo2,archivo );

FILE *file1 = fopen( archivo,"r" );
FILE *file2 = fopen( archivo2,"w" );

if(file1 == NULL || file2 == NULL ){
printf( "[!!] No se pudo abir el archivo ");
exit(0);
}

char c;

if(file1 == NULL || file2 == NULL){
printf("  [!!] No se pudo abrir el archivo\n");
}

while( (c = fgetc(file1)) != EOF ){
fputc(c,file2);
}

fclose(file1);
fclose(file2);

memset( archivo2, 0 ,200 );

}


Lo estoy programando en windows por si es importante de alguna manera. Gracias de antemano

Simplemente cambia en la funcion copia ese:
Código: php

char c;

por un
Código: php

int c;

fgetc y fputc devuelve un int, si solo pasas chars funcionará, pero en cuanto haya algún 0x00 dejara de copiar.

Lo siento, no contesto dudas por MP, si tienes dudas las planteas en el foro.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Simplemente cambia en la funcion copia ese:
Código: php

char c;

por un
Código: php

int c;

fgetc y fputc devuelve un int, si solo pasas chars funcionará, pero en cuanto haya algún 0x00 dejara de copiar.

Lo intente primero con un int, por lo que decias pero no funcionaba y lo cambie a char y seguida igual, voy a dejar foto de lo que pasa: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

imprime lo que te está dando la variable por pantalla:

Código: php

ent->d_name


Me parece que aparte de lo del char, estás abriendo con el nombre del archivo y no con la ruta completa. Con lo que te genera el archivo de salida con el nombre correcto pero no puede leer y no te escribe nada en la salida del archivo.

Lo siento, no contesto dudas por MP, si tienes dudas las planteas en el foro.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
imprime lo que te está dando la variable por pantalla:

Código: php

ent->d_name


Me parece que aparte de lo del char, estás abriendo con el nombre del archivo y no con la ruta completa. Con lo que te genera el archivo de salida con el nombre correcto pero no puede leer y no te escribe nada en la salida del archivo.

Tambien lo intente con la ruta en este caso "E:\" pero cuando lo intento asi me dice que no puedu abrir abrir el archivo en esta parte del codigo
Código: c
if(file1 == NULL || file2 == NULL ){
printf( "[!!] No se pudo abir el archivo ");
exit(0);
}


E intenado cambiando de int a char poniendo las rutas y usando en vez del fgetc y fputc usando el fwrite y fread e igual no funciona

Febrero 14, 2019, 02:32:13 PM #5 Ultima modificación: Febrero 14, 2019, 02:39:33 PM por animanegra
El fopen espera la ruta completa o ruta relativa a donde lo estés ejecutando. Si no, en principio no te va a poder abrir nada. ¿Usaste doble \\ en la ruta? (o la / como tienes en tu otra parte del código)

Lo siento, no contesto dudas por MP, si tienes dudas las planteas en el foro.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
El fopen espera la ruta completa o ruta relativa a donde lo estés ejecutando. Si no, en principio no te va a poder abrir nada. ¿Usaste doble \\ en la ruta?

Lo e intentado con en el \\ y el  / y mas de lo mismo me dice que el archivo no se puede abrir, la unica forma en que no me manda ese error es poniendo solo el nombre del archivo

puede ser que el error se genere al intentar copiar archivos con nombres que no sean soportados por la codificacion, o nombres de archivos ocultos?
Ademas porque la variable donde guardas los datos alojados no la cambias por una que contenga el path de windows ccomo ser %TEMP% o similar, para que no tengas problemas al usarlo en otras computaodras. saludso

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
puede ser que el error se genere al intentar copiar archivos con nombres que no sean soportados por la codificacion, o nombres de archivos ocultos?
Ademas porque la variable donde guardas los datos alojados no la cambias por una que contenga el path de windows ccomo ser %TEMP% o similar, para que no tengas problemas al usarlo en otras computaodras. saludos

Existe un archivo oculto en el pendrive pero no lo e podido borrar, aunque tampoco es como que me esforzara mucho en eso, voy a intentar borrarlo aunque considerando que otros pendrive tienen archivos ocultos existe una forma de identificarlos para saltarse su lectura? por ejemplo dentro de la estructura ent esta la variable d_type que puede ser DT_DIR cuando es una carpeta, existe algo parecido que diga que es un archivo oculto?

Acaba de pasar algo curioso, puse un printf en el nombre del archivo (osea el ent->d_name) y al imprimirlo me pone esto: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta. Como se ve en la imagen solo me pasa los 2 o 3 últimos caracteres del archivo. La verdad ahora si que no se que pasa. También elimine el archivo oculto del pendrive pero seguía igual, supongo por lo que explique antes

Febrero 14, 2019, 03:48:38 PM #10 Ultima modificación: Febrero 14, 2019, 04:10:44 PM por Solid Water
Utiliza memcpy o strcpy.
Yo creo que tienes un problema en las rutas y podrías probar hardcodearlas bien.
Por otro lado la falla de apertura de archivos podrías dividirla para saber cual de los 2 falla.

También te faltaría verificar que no sea un directorio.

Saludos

Código: c
#include <stdlib.h>
#include <stdio.h>
#include <dirent.h>
#include <sys/types.h>
#include <string.h>
#include <windows.h>

void Copia(char *archivo);

int main(){

DIR *dir ;

struct dirent *ent;
int i = 1;

while( free ){
dir = opendir("E:");
if(dir == NULL){
closedir(dir);
printf("  [!!] No se a encontrado el pendrive.\n" );
}else{
break;
}
Sleep(500);
}

while( (ent = readdir(dir)) != NULL ){
if( (strcmp(ent->d_name,".") != 0) && (strcmp(ent->d_name,"..") != 0) ){
printf(" %i-.%s \n",i ,ent->d_name);
i++;
Copia(ent->d_name);
}
}

closedir(dir);
return 0;
}

void Copia(char *file_name){

char ruta2[200] = "C:/Users/jm_ra/Documents/Copias/Copia-";
char ruta1[200] = "E:";

strcat(ruta2,file_name);
strcat(ruta1,file_name);

printf( "   %s\n", ruta1 );
printf( "   %s\n", ruta2 );

FILE *file1 = fopen( ruta1, "r" );
if(file1 == NULL){
printf("    [!!] No se encontro el archivo de lectura.\n" );
}

FILE *file2 = fopen( ruta2, "w" );
if(file2 == NULL){
printf("    [!!] No se encontro el archivo de Escritura\n" );
}

int c;
while((c = fgetc(file1)) != EOF){
fputc(c,file2);
}
memset(ruta1, 0 ,200);
memset(ruta2, 0 ,200);
}


Volví a escribir el código y ahora si pasa bien el nombre del archivo de hecho le puse la ruta en el archivo de lectura y si se supone que ahora lo abre pero igual no escribe en el archivo de salida.

Dejo foto: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

No se por que no te tira error el fopen, pero si

char ruta1[200] = "E:";

y

strcat(ruta1,file_name);

te queda E:nombredearchivo, sin la \\.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No se por que no te tira error el fopen, pero si

char ruta1[200] = "E:";

y

strcat(ruta1,file_name);

te queda E:nombredearchivo, sin la \\.
Con el \\ o sin el no me manda ni un error pero igual no copia nada asi que creo que el problema no esta por ese lado

Mira Frijo, así me funciona: (Solo cambia las rutas por las que tu requieres)

Código: c++

#include <WINDOWS.h>
#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <dirent.h>
#include <sys/types.h>
#include <string.h>


void Copia(char *archivo);

int main(){

        DIR *dir ;
       
        struct dirent *ent;
        int i = 1;

        while( free ){
                dir = opendir("C:\\frijo\\");
                if(dir == NULL){
                        closedir(dir);
                        printf("  [!!] No se a encontrado el pendrive.\n" );
                }else{
                        break;
                }
                Sleep(500);
        }

        while( (ent = readdir(dir)) != NULL ){
                if( (strcmp(ent->d_name,".") != 0) && (strcmp(ent->d_name,"..") != 0) ){
                        printf(" %i- %s \n",i ,ent->d_name);
                        i++;
                        Copia(ent->d_name);
                }
        }

        closedir(dir);
        return 0;
}

void Copia(char *file_name){

        char ruta2[200] = "C:\\frijo2\\Copia-";
        char ruta1[200] = "C:\\frijo\\";

        strcat(ruta2,file_name);
        strcat(ruta1,file_name);
       
        printf( "   %s\n", ruta1 );
        printf( "   %s\n", ruta2 );

        FILE *file1 = fopen( ruta1, "r" );
        if(file1 == NULL){
                printf("    [!!] No se encontro el archivo de lectura.\n" );
        }

        FILE *file2 = fopen( ruta2, "w" );
        if(file2 == NULL){
                printf("    [!!] No se encontro el archivo de Escritura\n" );
        }
       
        int c;
        while((c = fgetc(file1)) != EOF){
                fputc(c,file2);
        }

        memset(ruta1, 0 ,200);
        memset(ruta2, 0 ,200);
fclose(file1);
fclose(file2);

}

Ya lo solucione lo volví a escribir denuevo, aunque la verdad no se que hice distinto en la 3 ocasión, pero funciono voy a terminar para que detecte carpetas y también copie lo que encuentre en las carpetas y les comparto el código por si lo quieren usar o editar, gracias a todos lo que me ayudaron