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:
#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:
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:
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)”
Comments are closed.