Discussion:
Copiar un archivo
(demasiado antiguo para responder)
disuacidio
2004-02-18 01:12:02 UTC
Permalink
Hola,
¿alguien sabe si existe una función para copiar un archivo "tal cual"?
(quiero copiar de una carpeta a otra y cualquier tipo de archivo, imagen,
sonido, texto....)
He encontrado funciones "rename" y "remove", hay alguna para copiar? O tengo
que abrir el archivo, leer, copiar....?
No sé si me explico, soy bastante novato en C.
Gracias.
J.A. Gutierrez
2004-02-18 08:03:57 UTC
Permalink
disuacidio <***@yahoo.es> wrote:
: He encontrado funciones "rename" y "remove", hay alguna para copiar?

no

: O tengo que abrir el archivo, leer, copiar....?


Aqui tienes un par de ejemplos (habria que mejorar un poco
el tratamiento de errores):

---------------------------------------------------------------------------

int posix_cp(char *from, char *to)
{
#ifndef BS
#define BS 8192
#endif

int i;
int o;
int error;
char buffer[BS];
size_t n;
struct stat sbp;

if ( -1 != stat(to,&sbp))
{
fprintf(stderr,"%s: already exists\n", to);
return 2;
}

if ( -1 == ( o = open( to, O_WRONLY|O_CREAT, 0600)))
{
perror(to);
return 1;
}

if ( -1 == ( i = open( from, O_RDONLY)))
{
perror(from);
close(o);
return 1;
}

errno = 0;

while ( 0 < ( n = read( i, buffer, BS )))
write( o, buffer, n );


if ( errno != 0 )
perror("read");

close(i);
close(o);
return 0;
}

---------------------------------------------------------------------------
int cp(char *from, char *to)
{
#ifndef BS
#define BS 8192
#endif
FILE *i;
FILE *o;
char buffer[BS];
size_t n;
int r=0;


if ( NULL == ( o = fopen( to, "wb")))
{
perror(to);
return 1;
}

if ( NULL == ( i = fopen( from, "rb")))
{
perror(from);
fclose(o);
return 1;
}

while ( 0 != ( n = fread( buffer, 1, BS, i )))
fwrite( buffer, 1, n, o );


if (!feof(i))
{
perror("fread");
r=3;
}

fclose(i);
fclose(o);
return(r);
}
--
finger ***@shiva.cps.unizar.es for PGP /
.mailcap tip of the day: / La vida es una carcel
application/ms-tnef; cat '%s' > /dev/null / con las puertas abiertas
text/x-vcard; cat '%s' > /dev/null / (A. Calamaro)
Loading...