La Web del Programador: Comunidad de Programadores
 
    Pregunta:  19591 - AGREGAR UNOS BYTES EN EL COMIENZO DE UN ARCHIVO
Autor:  Ramon Villegas Rodriguez
Agregar en un Archivo una una parte al principio de el.
Es decir como hacer un append pero en el principio no al final.
Lo he intentado creando primero un archivo y grabar lo que necesito al princio y despues copiar todo lo demas del original.
Haciendolo con open open, input, put. Pero por ejemplo un archivo de 12 mb tarda como dos minutos. Es decir demasiado tiempo.
Desde ya muhas gracias. Por favor mandar la respuesta al mail.

  Respuesta:  Javier Perez
No existe otra forma, al menos otra forma sencilla.

Hay una forma, pero exige programar a muy bajo nivel, interfiriendo con el sistema, lo cual es muy poco recomendable si no se tiene muy claro que es lo que se está haciendo. Intentaré explicarla lo mejor que pueda.

Como sabes (y si no lo sabes te lo digo yo) los ficheros en el disco duro están organizados en clusters, de forma que siempre que se asigna más espacio a un fichero, se le asigna en clusters completos, independientemente de que únicamente se necesiten unos pocos bytes mas. El directorio y la FAT proporcionan la información de los clusters que corresponden a un fichero, de manera que en el directorio existe una entrada que indica cual es el primer cluster asignado al fichero. Luego, consultando en la FAT en la posición obtenida con la entrada del directorio se puede saber cual es el siguiente cluster asignado. Con este nuevo dato podemos a su vez obtener el siguiente cluster, y así sucesivamente hasta que la FAT contiene un número especial que indica que ya no hay mas clusters asignados al fichero.

Según esto sería posible modificar la entrada del directorio para que apuntase a un nuevo cluster tomado del espacio libre del disco, donde se almacenaría la información que hay que incluir al principio. Luego habría que modificar la FAT para que indicase que el siguiente cluster a este nuevo cluster es el primero de los que originalmente tenía el fichero, con lo que habríamos conseguido añadir información al principio del fichero sin efectuar un solo movimiento de datos, en un tiempo (despreciable) constante independientemente del tamaño del fichero.

Ahora bien, esta solución tiene dos inconvenientes:
- Primero, y muy gordo, la complejidad de la programación necesaria. Repito, no es labor para cualquiera.
- Segundo, la información añadida al inicio del fichero ocuparía un cluster completo, con lo que obtendrías una zona vacía entre los datos añadidos y el inicio de los datos originales. Esto puede ser un inconveniente o no, dependiendo de tus necesidades.

Mi consejo es que intentes acelerar al máximo el proceso del movimiento de datos. Por ejemplo, intenta leer en bloques grandes y que sean múltiplos de 1K (64K, 128K, ...)