Inicio > Apunte > El misterio de las extensiones de los archivos

El misterio de las extensiones de los archivos


Hoy por la mañana un tío en los foros de MSDN hizo una pregunta relacionada con las extensiones de los archivos. En esencia, lo que se preguntaba era que cómo era posible que una aplicación entendiera archivos con extensión totalmente diferente a la original, y que si se podía explicar cómo se codificaban las extensiones de los archivos.

Bien, dado que es un concepto que a veces cuesta trabajo entender (creo que por la naturaleza misma del concepto de extensión) aprovecho para hacer un pequeño apunte al respecto.

Por supuesto, todos conocemos lo que es una extensión de un archivo. Es decir, los documentos de Microsoft Word tienen una extensión .doc, los de Excel .xls, los de texto son .txt y el formato universal para música es .mp3. Pero ¿qué quiere decir esto de extensión? La respuesta no es muy complicada: una extensión no es otra cosa que parte del nombre del archivo. O mejor dicho, forma parte del nombre y son usadas para clasificar a los archivos, de la misma forma en la que nuestros apellidos son nombres para identificar la familia a la que pertenecemos. Pero la extensión no afecta las características de un archivo, así como el nombre no afecta mi ser: yo soy un humano independientemente de si me apellido Gómez, Pérez o Teal’c.

¿Para qué utilizar extensiones entonces? Bueno, el sistema operativo puede hacer búsquedas, filtros, ordenamientos y muchas otras cosas con esta información adicional, de la misma forma en la que una persona en el registro público puede encontrar nuestra información de forma más fácil si le damos nuestro apellido. Pero la extensión de un archivo, repito, no afecta el contenido del mismo.

En esencia, todos los archivos se guardan en un solo formato: binario. Todos, absolutamente todos. Es más, todo lo que está en nuestra máquina se encuentra en binario. En realidad, cuando uno dice que guarda un archivo en formato de texto, de XML, de Word, de PDF, etc., lo que quiere decir es que el arreglo de los bytes está hecho de tal forma que se puede representar como texto, como un XML, o que puede ser interpretado por programas que entiendan el ordenamiento de bytes establecido por Word o Acrobat. Incluso los ejecutables o las librerías de enlace dinámico son binarios, aunque estos son interpretados de forma especial por el sistema operativo.

Luego entonces, la capacidad de un programa de "leer" un tipo de archivo se traduce a si el programa puede o no entender e interpretar el orden de bytes que contiene un determinado archivo. Tomemos como ejemplo al Notepad. La finalidad de este programa consiste en leer y escribir texto simple. La tabla de caracteres ASCII (o UTF, Unicode, etc.) establece una correspondencia entre un byte y un caracter. Por ejemplo, el byte con valor 65 corresponde a la letra latina mayúscula A, mientras que la letra latina minúscula j se corresponde con un byte con valor 106. Y así sucesivamente, para cada caracter. Por ende, el Notepad lo que hace es interpretar estos números y dibujar en pantalla los píxeles correspondientes a cada caracter.

En cambio, un archivo de Word no solamente guarda texto, sino que guarda mucha más información: fuentes, colores, posición de las páginas, encabezados, imágenes, errores ortográficos y un larguísimo etcétera. Si abres un archivo Word con el Notepad verás la interpretación en texto simple del contenido binario. En algunos casos, reconocerás palabras (que se corresponde con el texto que guarda Word, eventualmente), aunque la mayor parte de las veces serán símbolos raros, correspondientes al equivalente en la tabla ASCII de los números que cada byte representa.

En fin, el punto es que la extensión de archivo no hace nada, y de hecho estas son arbitrarias. Normalmente, como programadores escogemos extensiones estándares e intuitivas (como .xml para documentos XML, .cpp y .cs para archivos de código C++ y C#, o incluso .dbf para un archivo que contenga una base de datos), o bien los escogemos por su contenido (por ejemplo, a veces se usa la extensión .dat para indicar un archivo que guarda datos de algún tipo, o .config para indicar que el archivo en cuestión es uno que guarda datos de configuración), o incluso se escogen en base al nombre del programa (por ejemplo, un .psd indica un archivo de imagen de Photoshop, o un .ppt indica un archivo de Power Point). Pero nuevamente, estos son arbitrarios.

Como prueba, hagamos este ejercicio. Abre Microsoft Excel, crea una hoja y mete algunos datos. Luego, guarda el archivo y cierra el programa. Una vez hecho esto, ve y cambia la extensión al archivo, digamos, de prueba.xls a prueba.fer. Abre Excel nuevamente, dale al menú Abrir y navega al directorio donde radica el archivo. Notarás que éste no aparece: esto es así porque Excel filtra los archivos mostrados a aquellos que tengan extensión xls o xlsx (un ejemplo de cómo las extensiones pueden hacer la vida más fácil). En fin, selecciona la opción de “mostrar todos los archivos” y ahora sí, selecciona a prueba.fer. Cuando Excel te pregunte que si deseas abrir el archivo, dile que sí, y voilá: sin problemas mostrará el archivo en cuestión. Esto es así porque solo cambió el nombre del archivo, mas no su contenido. Igual pasa con las extensiones de cualquier otro archivo: al final lo que importa es la interpretación que se le dé al contenido.

Ahora bien, desde el punto de vista de C# y .NET, abrir un archivo cualquiera significa utilizar un objeto de tipo FileInfo y mediante este, obtener un objeto de tipo FileStream (ambos declarados en System.IO). Al FileStream, como a cualquier otro flujo, le podemos leer o escribir bytes (obviamente dependiendo de si abrimos el archivo en modo lectura o escritura). Ahora que podemos usar algunas clases como BinaryReader y BinaryWriter para que nos ayuden a escribir el binario, o bien StreamReader y StreamWriter para que nos ayuden a escribir texto (en este caso, ambas clases se encargan de interpretar el binario como texto). Análogamente tenemos a XmlTextReader y XmlTextWriter. Y así sucesivamente. Bueno, ya en otra ocasión hice una entrada sobre los flujos de datos, ahí hay más información al respecto. Pero el punto es el mismo: lo que se lee y escribe es binario, puros bytes, solo que contamos con algunas clases que nos facilitan la lectura y escritura.

Bueno, pero… ¿qué onda con el formato? Ah bueno. El formato es, digamos, un acuerdo en cómo interpretar los bytes. En el caso de los archivos de texto, la interpretación se hace en base a la tabla ASCII / UTF / Unicode que corresponda. En el caso de un XML, no es otra cosa que un archivo de texto plano que tiene ciertas reglas para crear y acomodar marcas. Por otra parte, un mapa de bits de 32 bits guarda un byte para el color rojo, uno para el verde y uno para el color azul, más otro para la transparencia, aparte de guardar un encabezado con información adicional. Algunos formatos son estándares, como el texto o el XML, algunos son propietarios pero públicos como el JPEG o el GIF, y algunos otros son propietarios y privados, como el PSD o el DOC. De cualquier forma, es necesario conocer el formato de antemano, para leer un archivo. Por ejemplo, en el caso de los mapas de bits, necesitamos leer los primeros 54 bytes del archivo para tener información sobre la profundidad del color, el número de filas, etc.

Por supuesto, tú también puedes crear tus propios formatos. A este proceso se le llama serialización y la mayoría de los lenguajes y plataformas soporta la serialización. En .NET, por ejemplo, basta agregar el atributo [Serializable] a la clase y solito crea el formato necesario para leer y escribir un objeto de ese tipo. Adicionalmente, puedes implementar la interfaz ISerializable y tú mismo controlar qué se serializa y qué no.

En fin, bueno, eso ha sido todo. Espero haber sido claro y no haberte dejado más liado que cuando llegaste. Mi meta es quitar ese como velo de misterio que hay tras las extensiones, y espero haberlo logrado: de esta forma uno puede entender mejor los archivos y como crearlos. Ahí me dices si sí cumplí mi objetivo.

Arrivederci bambini!

Anuncios
Categorías:Apunte Etiquetas: ,
  1. yimb0
    octubre 20, 2010 en 2:12 am

    Muy buen articulo. Me tope con tu blog de casualidad, :) para el reader vas. Animo, que estan de lujos los articulos.

  1. enero 2, 2011 en 12:12 pm

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s