2008-11-25 11 views
7

Tengo una tabla con una columna binaria que almacena archivos de diferentes tipos de archivos posibles (PDF, BMP, JPEG, WAV, MP3, DOC, MPEG, AVI, etc.), pero no hay columnas que almacenen el nombre o la tipo del archivo original. ¿Hay alguna manera fácil de procesar estas filas y determinar el tipo de cada archivo almacenado en la columna binaria? Preferiblemente sería una utilidad que solo lea los encabezados de los archivos, de modo que no tenga que extraer completamente cada archivo para determinar su tipo.¿Existe una forma fácil de determinar el tipo de archivo sin conocer su extensión?

aclaración: Sé que el enfoque aquí implica leer solo el comienzo de cada archivo. Estoy buscando un buen recurso (también conocido como enlaces) que pueda hacer esto por mí sin demasiado alboroto. Gracias.

También, solo C# /. NET en Windows, por favor. No estoy usando Linux y no puedo usar Cygwin (no funciona en Windows CE, entre otras razones).

Respuesta

8

puede utilizar estas herramientas para encontrar el formato de archivo.

File Analyzer http://www.softpedia.com/get/Programming/Other-Programming-Files/File-Analyzer.shtml

qué formato http://www.jozy.nl/whatfmt.html

PE analizador de formato de archivo http://peid.has.it/

Este sitio web puede ser útil para usted. http://mark0.net/onlinetrid.aspx

Nota: He incluido los enlaces de descarga para asegurarme de que está obteniendo el nombre e información correctos de la herramienta.

por favor, verifique la fuente antes de descargarlos.

he usado una herramienta en el pasado, creo que es File Analyzer, que le dirá la coincidencia más cercana.

happy tooling.

+0

Gracias por los enlaces. Voy a verlos a todos. – MusiGenesis

6

Esta no es una respuesta completa, pero un lugar para comenzar sería una biblioteca de "números mágicos". Esto examina los primeros bytes de un archivo para determinar un "número mágico", que se compara con una lista conocida de ellos. Esta es (al menos parte) de cómo funciona el comando file en sistemas Linux.

+0

Esto será lo suficientemente completo para mí si puede indicarme una buena biblioteca como esta. – MusiGenesis

+0

Busque/usr/share/file/magic,/etc/magic o varias ubicaciones similares en una distribución de Linux o Unix. Como dice el otro cartel, también puedes obtenerlo con cygwin – ConcernedOfTunbridgeWells

+1

-1 downvote temporal (lo eliminaré en un momento). Necesito algo para .NET y, a veces, en preguntas como esta, 1000 personas verán "archivo" y "Linux" y una respuesta que evita que los espectadores se den cuenta de otros. nada personal. :) – MusiGenesis

2

La manera más fácil que conozco es utilizar el comando file que también está disponible en Windows con Cygwin.

1

Muchos tipos de archivos tienen encabezados bien definidos que comienzan el archivo. Puede verificar los primeros bytes para verificar cómo comienza el archivo.

1

La manera más fácil de hacer esto sería a través del acceso a un * nix (o cygwin) sistema que tiene el comando 'archivo':

$ file visitors.* 
visitors.html: HTML document text 
visitors.png: PNG image data, 5360 x 2819, 8-bit colormap, non-interlaced 

Se puede escribir una aplicación C# que canaliza los primeros bytes X de cada columna binaria al comando de archivo (usando - como el nombre del archivo)

4

Alguien más hizo una pregunta similar y publicó el código utilizado para hacer exactamente esto. Debería poder tomar lo que está publicado aquí, y modificarlo ligeramente para que saque de su base de datos.

https://stackoverflow.com/questions/58510

Además de eso, parece que alguien ha sin embargo escrito una biblioteca con sede fuera de números mágicos para hacer esto, parece que el sitio requiere registro, y alguna forma de acceso alternativo con el fin de descarga este lirbary. La documentación está disponible de forma gratuita sin registro, que puede ser útil.

http://software.topcoder.com/catalog/c_component.jsp?comp=13249160&ver=2

+1

Ese enlace de topcoder no permite la descarga incluso después de un proceso de registro esporádico. ¡No se acerque! – Brendan

1

Necesita utilizar algún código de interoperabilidad p/invoke para llamar al método SHGetFileInfo desde la API de Win32. Este article también puede ayudar.

+0

Creo que esto devolverá lo que el servidor crea que es el tipo de archivo (que probablemente estará bien), mientras que necesito un método que determine el mismo tipo de archivo sin importar en qué servidor se ejecute. – MusiGenesis

+0

Sí, devolverá lo que el servidor considere que es el tipo de archivo. Esta es la misma información que vería en el Explorador de Windows para la columna "Tipo". La única forma de saber en cualquier servidor es escribir su propia rutina de análisis para ver la extensión de archivo, los datos PE y los encabezados de archivo. –

Cuestiones relacionadas