¿Como saber el tipo de un archivo? (I)

Por alguna razón, este articulo viejo ha tenido algo de tráfico en los últimos días. Me dí cuenta que la idea de usar Java y JNI nunca se materializó, sólo dí unas pistas.

Una forma de hacer esto es llamando a la librería ‘magic’. Magic viene prácticamente en cualquier sistema operativo que se parezca a UNIX que se respete, como BSD, OSX y por supuesto Linux.

Si usted llama a la página man (man 3 libmagic) allí encontrará suficiente información. Por ejemplo, aquí les muestro un pequeño programa que hice en C el cual detecta el tipo de archivo que usted le pase por la línea de comandos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include 
#include 
 
/*
 * Program that shows how to use the magic library to figure out the type of a file
 * @author Jose V Nunez (josevnz@kodegeek.com)
 * License: BSD
 */
int main(int argc, char ** argv) {
 
        if (argc == 1) {
                printf("[ERROR]: Please provide the file name to check and try again!\n");
                return 1;
        }
 
        // See manpage libmagic for details on what this flags mean
        int flags = MAGIC_SYMLINK|MAGIC_COMPRESS|MAGIC_CONTINUE|MAGIC_PRESERVE_ATIME|MAGIC_ERROR;
 
        magic_t cookie = magic_open(flags);
        if (cookie == NULL) {
                printf("There was a problem opening the magic library!\n");
                return 1;
        }
        int status = magic_load(cookie, NULL);
        if (status != 0) {
                printf("Unable to load magic default database!, %s\n", magic_error(cookie));
                magic_close(cookie);
                return 1;
        }
 
        const char * file_details =  magic_file(cookie, argv[1]);
        printf("Type for file: %s is %s\n", argv[1], file_details);
 
        magic_close(cookie);
        return 0;
}

Para compilarlo les dejo un archivo Makefile:

1
2
3
CPPFLAGS += -O2 -L/Users/Shared/lib -I/Users/Shared/include -lmagic
all: magic.c
        $(CC) $(CPPFLAGS) magic.c -o magic

Y finalmente como se corre:

1
2
3
4
5
auyan:c josevnz$ make
cc -O2 -L/Users/Shared/lib -I/Users/Shared/include -lmagic magic.c -o magic
auyan:c josevnz$ ./magic /Users/josevnz/CTX.DAT
Mime type for file: /Users/josevnz/CTX.DAT is Java serialization data, version 5
auyan:c josevnz$

En la siguiente entrada las prometo como hacer esto desde Java (pista, vamos a utilizar JNI).

–José

2 thoughts on “¿Como saber el tipo de un archivo? (I)

  1. Pingback: BlogESfera.com
  2. Pingback: Bitacoras.com

Los comentarios estan cerrados