2011-06-04 25 views
8

Tengo un servicio WCF simple que permite a los clientes/consumidores cargar archivos de imagen, audio o video en él. Después de la carga, el servicio se supone que debe analizar el archivo y de alguna manera recuperar los siguientes atributos:Obtener atributos de archivo específicos

Image: anchura, altura, fecha de toma, programa utilizado

audio: tiempo de ejecución, artista, álbum, género, tasa de bits, año de publicación

vídeo: tiempo de ejecución, anchura, altura, fotogramas/segundo, bitrate de vídeo, velocidad de bits de audio

Al parecer, Windows puede obtener y mostrar estos atributos con bastante facilidad, pero ¿cómo puedo hacerlo en C#?

+2

posible duplicado de [Leer/Escribir propiedades de archivo 'Extendido' (C#)] (http://stackoverflow.com/questions/220097/read-write-extended-file-properties-c) – AxelEckenberger

Respuesta

7

Courtesty de this thread.

He verificado esto se pone toda atributos de archivo que incluye los atributos extendidos.

En su proyecto vaya a 'Agregar referencia' -> COM -> 'Controles de Shell de Microsoft y Automatización'

añadir que, una y otra vez cortesía de dicho hilo, un método de C# para leer los atributos de los archivos en un directorio. (Todavía estoy investigando para ver si es posible llevar a cabo esta funcionalidad en un archivo específico. Si no siempre se puede pasar el nombre del archivo en cuestión y verificar que sólo recibe los atributos a cabo para ese archivo.)

public static void Main(string[] args) 
{ 
    List<string> arrHeaders = new List<string>(); 

    Shell32.Shell shell = new Shell32.Shell(); 
    Shell32.Folder objFolder; 

    objFolder = shell.NameSpace(@"C:\temp\testprop"); 

    for(int i = 0; i < short.MaxValue; i++) 
    { 
     string header = objFolder.GetDetailsOf(null, i); 
     if (String.IsNullOrEmpty(header)) 
      break; 
     arrHeaders.Add(header); 
    } 

    foreach(Shell32.FolderItem2 item in objFolder.Items()) 
    { 
     for (int i = 0; i < arrHeaders.Count; i++) 
     { 
      Console.WriteLine("{0}\t{1}: {2}", i, arrHeaders[i], objFolder.GetDetailsOf(item, i)); 
     } 
    } 
} 
+1

Tenga en cuenta que esta solución no funciona en Windows XP. Al acceder a Shell32 desde XP, obtiene una excepción COM. –

+1

Según mi mejor conocimiento/experiencia, esto funciona bien en XP. ¿Qué problema estás viendo? – Khepri

2

La forma más sencilla de acceder a esa información es dejar que Shell (Explorer) lo haga por usted y solo solicite (a través del Windows Property System). Y la forma más sencilla de hacerlo desde C# es usar el Windows API Code Pack for .NET.

Específicamente, va a querer acceder a la tienda de propiedades. Para obtener ayuda para comenzar, busque en la carpeta Samples en el proyecto PropertiesEditDemo.

Puede hacerlo usted mismo leyendo todos los metadatos del archivo, pero el problema es que su programa debe conocer todos los metadatos disponibles para todos los tipos de archivos disponibles. Por lo general, prefiero esperar el Shell por ese conocimiento.

Cuestiones relacionadas