Underc0de

Foros Generales => Dudas y pedidos generales => Mensaje iniciado por: Frijolito en Febrero 14, 2019, 12:40:13 PM

Título: Problema al copiar archivos en C
Publicado por: Frijolito en Febrero 14, 2019, 12:40:13 PM
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.

#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
Título: Re:Problema al copiar archivos en C
Publicado por: animanegra en Febrero 14, 2019, 01:27:32 PM
Simplemente cambia en la funcion copia ese:

char c;

por un

int c;

fgetc y fputc devuelve un int, si solo pasas chars funcionará, pero en cuanto haya algún 0x00 dejara de copiar.
Título: Re:Problema al copiar archivos en C
Publicado por: Frijolito en Febrero 14, 2019, 01:43:24 PM
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Simplemente cambia en la funcion copia ese:

char c;

por un

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: https://ibb.co/k4PFFR2
Título: Re:Problema al copiar archivos en C
Publicado por: animanegra en Febrero 14, 2019, 02:08:18 PM
imprime lo que te está dando la variable por pantalla:


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.
Título: Re:Problema al copiar archivos en C
Publicado por: Frijolito en Febrero 14, 2019, 02:23:31 PM
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
imprime lo que te está dando la variable por pantalla:


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 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
Título: Re:Problema al copiar archivos en C
Publicado por: animanegra en Febrero 14, 2019, 02:32:13 PM
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)
Título: Re:Problema al copiar archivos en C
Publicado por: Frijolito en Febrero 14, 2019, 02:41:35 PM
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
Título: Re:Problema al copiar archivos en C
Publicado por: hielasangre en Febrero 14, 2019, 03:05:13 PM
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
Título: Re:Problema al copiar archivos en C
Publicado por: Frijolito en Febrero 14, 2019, 03:13:15 PM
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?
Título: Re:Problema al copiar archivos en C
Publicado por: Frijolito en Febrero 14, 2019, 03:40:12 PM
Acaba de pasar algo curioso, puse un printf en el nombre del archivo (osea el ent->d_name) y al imprimirlo me pone esto: https://ibb.co/LhYxTws. 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
Título: Re:Problema al copiar archivos en C
Publicado por: Solid Water en Febrero 14, 2019, 03:48:38 PM
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
Título: Re:Problema al copiar archivos en C
Publicado por: Frijolito en Febrero 14, 2019, 04:44:52 PM
#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: https://ibb.co/QkvS36h
Título: Re:Problema al copiar archivos en C
Publicado por: Solid Water en Febrero 14, 2019, 04:52:19 PM
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 \\.
Título: Re:Problema al copiar archivos en C
Publicado por: Frijolito en Febrero 14, 2019, 05:06:56 PM
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
Título: Re:Problema al copiar archivos en C
Publicado por: Solid Water en Febrero 14, 2019, 06:12:15 PM
Mira Frijo, así me funciona: (Solo cambia las rutas por las que tu requieres)

Código (c++) [Seleccionar]

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

}
Título: Re:Problema al copiar archivos en C
Publicado por: Frijolito en Febrero 14, 2019, 07:14:04 PM
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