Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-10-2016
Avatar de cl2raul
cl2raul cl2raul is offline
Miembro
 
Registrado: sep 2008
Ubicación: La Habana, Cuba
Posts: 88
Poder: 16
cl2raul Va por buen camino
como saber que tipo de fichero es

Hola a todos:
estoy haciendo un programa, donde necesito determinar que tipo de archivo es el seleccionado...
sere mas especifico, tenemos un archivo de imagen, puede ser bmp, gif, jpg, png, etc. Este archivo, es myimagen.png, cullo contenido es una foto de mi hermano, pero el, le cambio la extension y desde que descubrio esto, esconde sus archivos de esta forma, y tengo que estar probando cada programa para saber cual me habre correctamente el archivo...
alguien tiene algun metodo o funcion para saber que tipo de fichero es...
Responder Con Cita
  #2  
Antiguo 09-10-2016
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
El mismo Paint abre el archivo aunque su extensión esté cambiada...

Saludos.
Responder Con Cita
  #3  
Antiguo 10-10-2016
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.269
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Supongo que debe haber una cabecera estandard para cada tipo de fichero (N bytes al inicio que sean coincidentes para todos los ficheros de un tipo).
Deberías investigar esos ficheros para los diferentes tipos e intentar identificarlos.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 10-10-2016
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Poder: 11
bucanero Va camino a la fama
Hola a todos,

yo utilizo las siguiente función para determinar el tipo imagen para las extensiones mas conocidas,

Código Delphi [-]
interface
...
   function  GetImageFormat(const AFileName: String; OmitirExtension:Boolean=true): String; overload;
   function  GetImageFormat(Stream: TStream; var fileType:String):boolean; overload;
...
implementation
...
function GetImageFormat(const AFileName: String; OmitirExtension:Boolean=true): String;
///  Si el parametro omitirExtension esta a true, solamente devuelve una extensión
///  cuando las cabezeras del fichero son realmente reconocidas
var
  ext: string;
  FileStream: TFileStream;
begin
  ext := lowerCase(extractFileExt(AFileName));
  try
    FileStream := TFileStream.Create(AFileName, fmOpenRead);
    try
      if not GetImageFormat(FileStream, result) and
       not omitirExtension then
           // si no se reconoce el fichero por su primeros caractes, se devuelve la propia extensión del fichero
           Result:=ext;
    finally
      FileStream.free;
    end;
  except
  end;
end;

function GetImageFormat(Stream: TStream; var fileType:string):Boolean;
var
  FirstBytes: AnsiString;
begin
  result:=False;
  fileType := '';
  if (Stream <> nil) and (Stream.Size > 40) then
  try
    SetLength(FirstBytes, 8);
    Stream.Read(FirstBytes[1], 8);
    if (Copy(FirstBytes, 1, 2) = 'BM') then
      fileType := '.bmp'
    else if (FirstBytes = #137'PNG'#13#10#26#10) then
      fileType := '.png'
    else if (Copy(FirstBytes, 1, 3) = 'GIF') then
      fileType := '.gif'
    else if  (Copy(FirstBytes, 1, 2) = #$FF#$D8) then
      fileType := '.jpg'
    else if (Copy(FirstBytes, 1, 3) = #$49#$49#$2A) then
      fileType := '.tif'
    else if (Copy(FirstBytes, 1, 3) = #$0#$0#$01) then
      fileType := '.ico';
  finally
    result:=(fileType<>'');
  end;
end;
...
end.

Para el resto de extensiones simplemente hay que buscar las cabezeras que utilizan y añadirlas a la lista

Un saludo
Responder Con Cita
  #5  
Antiguo 10-10-2016
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
En algunos *nix se puede correr:

Cita:
file --mime FILE
Esto esta basado en libmagic. Lo he usado en python:

https://stackoverflow.com/questions/...python#2753385


---

Ahora, dile a tu hermano que deje de esconder sus fetiches de esa manera...
__________________
El malabarista.
Responder Con Cita
  #6  
Antiguo 10-10-2016
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por mamcx Ver Mensaje
Ahora, dile a tu hermano que deje de esconder sus fetiches de esa manera...
O que deje de ver las fotos de su hermano

LineComment Saludos
Responder Con Cita
  #7  
Antiguo 11-10-2016
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
Bueno, no sé si he llegado tarde... en fin, para saber el MimeType de un archivo, también puedes usar las Indy:

Código Delphi [-]
Uses IdGlobalProtocols;

function GetMIMEType(sFile: TFileName): string;
var
  aMIMEMap: TIdMIMETable;
begin
  aMIMEMap := TIdMIMETable.Create(true);
  try
    result := aMIMEMap.GetFileMIMEType(sFile);
  finally
    aMIMEMap.Free;
  end;
end;

Y usarla así:

Código Delphi [-]
  
if OpenDialog1.Execute() then
    ShowMessage(GetMIMEType('C:\RutaArchivo.ext'));

Sacado de http://stackoverflow.com/questions/2...rver-with-indy
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #8  
Antiguo 15-10-2016
Avatar de cl2raul
cl2raul cl2raul is offline
Miembro
 
Registrado: sep 2008
Ubicación: La Habana, Cuba
Posts: 88
Poder: 16
cl2raul Va por buen camino
jhonny, gracias por tu aporte todo es bien recibido, lo probare y vere si funciona, sin que el archivo tengan las extenciones....

gracias bucanero, tu codigo es de 10, solo tengo algunas duditas:
yo modifique tu codigo para saber el encabezado de cada uno de los ficheros y resulta q tengo dudas, ¿como sabes tu, que el .jpg es Copy(FirstBytes, 1, 2) y no Copy(FirstBytes, 1, 3)?...
como puedes diferenciar .jpg de .jpe y .jpeg que al final me dan el mismo encabezado...
tambien me resulto que el encabezado de .wma y .wmv son los mismo. claro esta q al reproducirlos se determina q tipo de contenidos trae...

esta charranada de mi hermano me motivo a investigar un poquito mas por lo que tome varios archivos de audio, video, imagen, comprimidos y ejecutables y muestro los encabezados de cada uno al cargarlos en la app y me surguio una pregunta... puedo yo cambiar el encabezado de los archivos, ya sea modificandolos o agregandole y que estos no se corrompan o sea que no pierda la info y se reproduzca, visualice o ejecute.

gracias tambien a mamcx, yo propongo crear una dll (entre los interesados en el clubdelphi) donde recojan gran parte de las extenciones mas usada y clasificarlas usando el codigo de bucanero a no ser que ya exista y alguien quiera dar luz... no me he motivado a terminar nigun tutorial de python, si se pudiera convertir esa lib en dll seria genial, pero creo que si nos unimos tendremos una, para la comunidad.

gracias a todos.
Responder Con Cita
  #9  
Antiguo 15-10-2016
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Esa DLL ya existe. Se llama libmagic. Y ademas esta la opcion de jhonny, que deberias probar.

---

Mas concretamente:

Cita:
¿como sabes tu, que el .jpg es Copy(FirstBytes, 1, 2) y no Copy(FirstBytes, 1, 3)?
Eso se sabe viendo las especificaciones de cada formato. Lo cual es una tarea larga (y ya hecha).
__________________
El malabarista.
Responder Con Cita
  #10  
Antiguo 22-10-2016
Avatar de cl2raul
cl2raul cl2raul is offline
Miembro
 
Registrado: sep 2008
Ubicación: La Habana, Cuba
Posts: 88
Poder: 16
cl2raul Va por buen camino
GRACIAS A TODOS,
si mamcx, ya vi la opcion de jhonny y muestro los resultados, pero no me facilitan las cosas... creo q por ahora sigo tomando la opcion de bucanero, que pese a q es mas larga, tiene alto rendimiento y mas comoda para mi, el problema esta en las cabeceras que hay cabeceras que los ficheros son distintos tipos, por ejemplo una dll y un exe; inclusibe hay distintas cabeceras entre dll (q rollo)...

mas seguire tu consejo de la libreria (libmagic) y buscare todas las llamadas que se le puedan hacer y probare, si tienes un link que muestre todas las llamadas a la libreria seria genial. O me vere reinbentando la rueda....
Responder Con Cita
  #11  
Antiguo 24-10-2016
Avatar de cl2raul
cl2raul cl2raul is offline
Miembro
 
Registrado: sep 2008
Ubicación: La Habana, Cuba
Posts: 88
Poder: 16
cl2raul Va por buen camino
bueno, por fin puedo modificar las cabeseras de los archivos??? y estos siguen siendo los mismos...
Responder Con Cita
  #12  
Antiguo 24-10-2016
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.
Cita:
Empezado por cl2raul Ver Mensaje
....
¿como sabes tu, que el .jpg es Copy(FirstBytes, 1, 2) y no Copy(FirstBytes, 1, 3)?...
como puedes diferenciar .jpg de .jpe y .jpeg que al final me dan el mismo encabezado
...
Podes consultar aquí: File Signature Database

Cita:
Empezado por cl2raul Ver Mensaje
bueno, por fin puedo modificar las cabeseras de los archivos??? y estos siguen siendo los mismos...
¿ Es una pregunta o nos comentas que diste con la solución ?

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #13  
Antiguo 25-10-2016
Avatar de cl2raul
cl2raul cl2raul is offline
Miembro
 
Registrado: sep 2008
Ubicación: La Habana, Cuba
Posts: 88
Poder: 16
cl2raul Va por buen camino
Cita:
Empezado por ecfisa Ver Mensaje

¿ Es una pregunta o nos comentas que diste con la solución ?
es pregunta, gracias por comentar
Responder Con Cita
  #14  
Antiguo 25-10-2016
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Si modificas las cabeceras estarás corrompiendo el archivo.
__________________
El malabarista.
Responder Con Cita
  #15  
Antiguo 25-10-2016
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Si interpreto bién tu consulta, la respuesta es si. Aunque modifiques el file signature, el resto del contenido del archivo seguirá siendo el mismo.

Por si te pudiera ser útil, aquí encontré otra lista de file signatures.


Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #16  
Antiguo 25-10-2016
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Si tratas de esconder un archivo gráfico cambiando su cabecera, ten por seguro que ningún programa lo reconocerá como válido. Restaurando la cabecera, todo volverá a funcionar.


Saludos.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
como saber el tamaño de un fichero kenychy C++ Builder 13 19-11-2010 16:46:59
Como saber si un fichero está abierto RaulChemical API de Windows 13 30-12-2008 17:31:42
Cómo saber qué tipo de SO es. Ziara C++ Builder 4 22-09-2008 13:04:21
Cómo saber si un fichero esta marcado de sólo lectura ? David Varios 2 13-08-2008 16:20:19
como saber el tipo de datos de un campo miguelml Varios 4 17-11-2005 08:36:17


La franja horaria es GMT +2. Ahora son las 10:10:37.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi