2009-12-29 10 views
8

Ho bisogno di un metodo che possa dirmi se un file è un'immagine, un file audio o video. Posso farlo con C#?Verifica se il file è un file multimediale in C#

+1

Punto di chiarimento: vuoi sapere se rientra in * qualsiasi * delle categorie ("è un file multimediale"), o * quale * categoria rientra in ("è un'immagine/è audio/è video")? – GalacticCowboy

+0

Non fa davvero la differenza. – SLaks

+0

@SLaks: corretto, è praticamente solo semantica, ma la soluzione dovrebbe essere leggermente più intelligente di una semplice raccolta di estensioni. Dovrebbe mappare quell'estensione ad un significato di livello superiore. – GalacticCowboy

risposta

26

Dipende da come robusto si vuole che sia.

Il modo più semplice per farlo è quello di verificare l'estensione, in questo modo:

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()); 
} 

EDIT: Per chi vuole veramente LINQ, eccolo:

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

Si noti che l'estensione di un file non è un indicatore affidabile del suo contenuto; chiunque può rinominare un file e modificarne l'estensione.

Se non si dispone dell'estensione o se non ci si fida di esso, è possibile leggere l'inizio del file e verificare che corrisponda alle firme dei file per i formati multimediali comuni.

+0

Perché è stato downvoted? – SLaks

+0

forse alla gente non piacciono gli array di stringhe? o forse avresti potuto usare Contains? ho upvoted .. –

+0

'Array' non ha un metodo' Contains'. (Tranne tramite LINQ) – SLaks

0

È sempre possibile verificare l'estensione del file.

+0

Perché è stato downvoted? È una risposta perfettamente accettabile anche se manca un esempio di codice. – Thomas

+0

@Thomas: lo spartito dice che questo è un caso limite, che sembra valido: "Qualsiasi risposta che faccia andare il colpevole nella giusta direzione è utile, ma cerca di menzionare eventuali limitazioni, ipotesi o semplificazioni nella tua risposta. Brevity è accettabile, ma le spiegazioni più complete sono migliori. Https://stackoverflow.com/help/how-to-answer – Stefan

8

Metodo 1: Il più semplice: analisi del nome del file. Se il nome del file corrisponde a un elenco noto di tipi di file multimediali (ad esempio jpg gif wmv avi mp4 ecc.), Corrisponde a un file video, audio o immagine. Questo non è così robusto dato che posso facilmente nominare un file di testo con l'estensione .avi o .jpg, ma questo non lo rende necessariamente un file multimediale.

Metodo 2: Harder - Intestazione del file di analisi. Ad esempio, su CodeProject c'è un C# RIFF Parser o questo articolo CodeProject su Extracting IPTC header information from JPEG images

Finirai per dover utilizzare una combinazione di entrambi i metodi. La maggior parte di ciò che stai chiedendo è già integrato nel framework .NET.

+0

L'altro problema con il metodo 2 è che devi avere un parser per ogni tipo di file e altri tipi di file non verrà riconosciuto fino a quando non si implementa il parser ... – GalacticCowboy

+0

@GC: Sì, corretto –

2

Sì, ma se non si sta utilizzando un componente per farlo, è necessario scrivere il codice per caricare almeno le intestazioni di tali file al fine di verificare se non sono danneggiati. Se i file sono memorizzati in modo affidabile, si può forse resta che verificare l'estensione del file

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

Penso che dovrebbe essere una buona pratica spiegare perché il voto negativo. Se ciò che è previsto è una semplice implementazione ingenua, la risposta è molto semplice. Ma cosa succede se qualcuno cambia l'estensione dei file e si incasina con i loro nomi? Credi in Santa Claws? – Andres

+2

non ho fatto downvot.ma per i principianti non tutte le estensioni saranno minuscole, e immaginate il tipo di gigantesca dichiarazione se questa deve essere per catturare tutti i tipi di media .. –

+0

Ok, ecco perché EndsWith ha un secondo parametro per dire di ignorare il carattere. Ora penso che anche le altre risposte dovrebbero essere rifiutate perché sono simili al mio nel significato – Andres

Problemi correlati