Beraldo 864 Denunciar post Postado Outubro 25, 2008 Já faz uns dias que estou tentando descobrir se há como detectar o mime-type de um arquivo usando C. O máximo que encontrei foi uma função personalizada que retorna o mime-type conforme a extensão do arquivo,. Porém, não quero algo que relacione a extensão do arquivo com o mime-type, já que isso não seria muito fiel. Minha intenção é saber se um determinado arquivo é binário ou não. Para o programa lê-lo adequadamente. O que consegui fazer foi isto: #include <stdio.h> #include <stdlib.h> #include <ctype.h> int main(int argc, char *argv[]) { FILE *fp; char c; if ((fp = fopen(argv[1], "r")) == NULL) { fprintf(stderr, "Erro ao abrir arquivo\n"); exit(1); } if ( isalnum(c = fgetc(fp)) ) { printf("é ASCII\n"); } else { printf("Não é ASCII\n"); } fclose(fp); return 0; } Aparentemente funcionou. Mas parece um tanto "gambiárrico" Há uma forma mais bonita de fazer isso? Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Outubro 25, 2008 Por 'binário' você quer dizer "executável" ou "só abre com um programa"? Um arquivo de registros, por exemplo, pode ser um binário mas não é executável. Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Outubro 25, 2008 Um arquivo de registros, mesmo. Um arquivo gerado pelo próprio C, ao gravar estruturas com fwrite() Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Outubro 25, 2008 O modo mais safo de se fazer isso acho que é usando o comando file. Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Outubro 25, 2008 você se refere ao file do Unix, né? Mas como eu posso pegar o resultado de system(), já que essa função retorna um inteiro? Talvez executando algo assim: system("file -i arquivo > tmp"); verifica o valor de tmp usando ER remove tmp Não é difícil, mas há alguma forma mais simples? Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Outubro 25, 2008 Use popen. Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Outubro 25, 2008 Perfeito, Isis. Aprendi mais uma. :) Muito obrigado, novamente. :D Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Outubro 25, 2008 P/ quem não sacou ainda: #include <stdio.h> #include <string.h> int main(int argc, char *argv[]) { char s[50]; char *com = "file -bi vazio"; FILE *B = popen(com,"r"); fgets(s,50,B); (*strchr(s,(int)'\n')) = '\0'; pclose(B); printf("==>%s\n",s); return 0; } Compartilhar este post Link para o post Compartilhar em outros sites
quitZAUMMM 18 Denunciar post Postado Outubro 27, 2008 boa tbm aprendi + uma http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Compartilhar este post Link para o post Compartilhar em outros sites