2009-12-29 30 views
8

Necesito un método que pueda decirme si un archivo es de imagen, audio o video. ¿Puedo hacer esto con C#?Comprueba si el archivo es un archivo multimedia en C#

+1

Punto de aclaración: desea saber si pertenece a * cualquier * de las categorías ("es un archivo multimedia") o * a qué categoría pertenece ("es una imagen/es audio/es video"))? – GalacticCowboy

+0

Realmente no hace la diferencia. – SLaks

+0

@SLaks: correcto, es prácticamente una semántica, pero la solución debería ser un poco más inteligente que una simple colección de extensiones. Tendría que asignar esa extensión a algún significado de nivel superior. – GalacticCowboy

Respuesta

26

Depende de lo robusta que quiere que sea.

La forma más sencilla de hacerlo es comprobar la extensión, así:

static string[] mediaExtensions = { 
    ".PNG", ".JPG", ".JPEG", ".BMP", ".GIF", //etc 
    ".WAV", ".MID", ".MIDI", ".WMA", ".MP3", ".OGG", ".RMA", //etc 
    ".AVI", ".MP4", ".DIVX", ".WMV", //etc 
}; 

static bool IsMediaFile(string path) { 
    return -1 != Array.IndexOf(mediaExtensions, Path.GetExtension(path).ToUpperInvariant()); 
} 

EDITAR: Para aquellos que realmente quieren LINQ, aquí está:

return mediaExtensions.Contains(Path.GetExtension(path), StringComparer.OrdinalIgnoreCase); 

Tenga en cuenta que la extensión de un archivo no es un indicador confiable de su contenido; cualquiera puede cambiar el nombre de un archivo y cambiar su extensión.

Si no tiene la extensión, o si no confía en ella, puede leer el principio del archivo y ver si coincide con las firmas de archivos para los formatos de medios comunes.

+0

¿Por qué se bajó este valor? – SLaks

+0

tal vez a la gente no le gustan los arreglos de cuerdas? o tal vez podrías haber usado Contiene? He votado a favor ... –

+0

'Array' no tiene el método' Contains'. (Excepto a través de LINQ) – SLaks

0

Siempre puede verificar la extensión del archivo.

+0

¿Por qué se bajó este valor? Es una respuesta perfectamente aceptable, aunque le falta una muestra de código. – Thomas

+0

@Thomas: los puntajes dicen que este es un caso marginal, lo que parece válido: 'Cualquier respuesta que haga que el consultante vaya en la dirección correcta es útil, pero trate de mencionar cualquier limitación, suposición o simplificación en su respuesta. La brevedad es aceptable, pero las explicaciones más completas son mejores. Https://stackoverflow.com/help/how-to-answer – Stefan

8

Método 1: El más fácil: análisis de nombre de archivo. Si el nombre de archivo coincide con una lista conocida de tipos de archivos multimedia (es decir, jpg gif wmv avi mp4, etc.), coincide con un archivo de video, audio o imagen. Esto no es tan sólido ya que puedo nombrar fácilmente un archivo de texto con la extensión .avi o .jpg, pero eso no necesariamente lo convierte en un archivo multimedia.

Método 2: Más difícil - Parse el encabezado del archivo. Por ejemplo, en CodeProject hay un artículo C# RIFF Parser o este artículo de CodeProject en Extracting IPTC header information from JPEG images

Finalmente terminará teniendo que usar una combinación de ambos métodos. La mayoría de lo que estás preguntando ya está integrado en .NET Framework.

+0

El otro problema con el método 2 es que debe tener un analizador para cada tipo de archivo y otros tipos de archivos. no será reconocido hasta que implemente su analizador ... – GalacticCowboy

+0

@GC: Sí, correcto –

2

Sí, pero a menos que esté utilizando un componente para hacerlo, tendrá que escribir un código para cargar al menos los encabezados de esos archivos para comprobar si no están dañados. Si los archivos se almacenan en una manera fiable, puede tal vez sólo comprobar su extensión de archivo

foreach(string file in Directory.GetFiles("c:\\MyDir\\") 
{ 
    if(file.EndsWith("jpg", false, null)) 
     //treat as image file 
    else if(file.EndsWith("avi", false, null)) 
     //treats as avi video 
    //and so on 
} 
+0

Creo que debería ser una buena práctica explicar por qué el voto negativo. Si lo que se espera es una simple implementación ingenua, la respuesta es muy simple. ¿Pero qué pasa si alguien cambia la extensión de sus archivos y desordena sus nombres? ¿Crees en Santa Claws? – Andres

+2

No he votado negativamente.pero para empezar, no todas las extensiones serán minúsculas, e imagine el tipo de afirmación gigantesca que tiene que ser para captar todos los tipos de medios. –

+0

Ok, es por eso que EndsWith tiene un segundo parámetro que decir para ignorar el caso de caracteres. Ahora creo que las respuestas de otros deberían ser votadas también, ya que son similares a las mías en el significado – Andres

Cuestiones relacionadas