/* Este es un programa ejemplo sencillo que ilustra como */ /* se manejan ficheros a bajo nivel en UNIX, en este programa */ /* se copia un archivo en otro */ /* Si entiendes el manejo de ficheros a bajo nivel en UNIX */ /* y una vez estudidado el programa deberias saber responder */ /* las siguientes cuestiones: */ /* ¿Que pasa si los ficherosi a abrir no existen? */ /* ¿Que condiciones se han de cumplir para que las aperturas se */ /* se realicen con exito? */ /* ¿Como se detecta el final de fichero en el archivo origen? */ /* Ficheros cabecera empleados */ #include #include #include #include /* Definicion de algunas constantes */ #define BYTES_TRANSF 1024 #define DNOM_FICHERO 100 #define ERROR -1 extern int errno; char buffer[BYTES_TRANSF]; char nombre1[DNOM_FICHERO], nombre2[DNOM_FICHERO]; main() { int fd_orig, fd_dest , i, j ; ssize_t nbytes_in, nbytes_out; /* Entrada del archivo origen */ printf("\n Nombre del fichero origen: ") ; scanf("%s",nombre1) ; /* Apertura del archivo origen: fijate en los parametros */ fd_orig = open( (const char *)nombre1 , O_RDONLY ) ; /* Comprobamos resultado de la apertura */ if ( fd_orig == ERROR ) { perror("ERROR EN APERTURA ARCHIVO ORIGEN: "); return ; } /* Entrada del archivo destino */ printf("\n Nombre del fichero destino: "); scanf("%s",nombre2); /* Comprobamos resultado de la apertura */ fd_dest = open( (const char *)nombre2, O_CREAT|O_WRONLY, 0666 ); if ( fd_dest == ERROR ) { perror("ERROR EN APERTURA ARCHIVO DESTINO: "); return; } /* Bucle de lectura del archivo origen y escritura en el de destino */ do { /* Leemos bytes del archivo origen */ nbytes_in = read( fd_orig, (void *)buffer, (size_t)BYTES_TRANSF ); /* Comprobamos resultado de la lectura */ if ( nbytes_in == ERROR ) { perror("ERROR LECTURA: "); break; } else { /* Se escribe si se ha leido al menos 1 byte */ if ( nbytes_in ) { nbytes_out = write( fd_dest , (const void *)buffer , (size_t)nbytes_in ) ; if ( nbytes_out < nbytes_in ) { perror("ERROR EN ESCRITURA: ") ; break; } } } } while( nbytes_in == (ssize_t)BYTES_TRANSF ); /* Test de final de fichero */ /* Cerramos archivos */ if ( close(fd_orig) == ERROR ) perror("ERROR EN CIERRE ARCHIVO ORIGEN: "); if ( close(fd_dest) == ERROR ) perror("ERROR EN CIERRE ARCHIVO DESTINO: "); }