una propiedades propiedad programacion metodos informatica definicion declaracion clase automaticos accesores c# extended-properties

programacion - Lectura/escritura de propiedades de archivo ''Extendidas''(C#)



propiedades en informatica definicion (9)

Estoy tratando de averiguar cómo leer / escribir en las propiedades de archivos extendidos en C #, por ejemplo, Comentario, Velocidad de bits, Fecha de acceso, Categoría, etc. que puede ver en el Explorador de Windows. ¿Alguna idea de como hacer esto? EDITAR: Principalmente estaré leyendo / escribiendo en archivos de video (AVI / DIVX / ...)


Solución 2016

Agregue los siguientes paquetes NuGet a su proyecto:

  • Microsoft.WindowsAPICodePack-Shell de Microsoft
  • Microsoft.WindowsAPICodePack-Core de Microsoft

Propiedades de lectura y escritura

using Microsoft.WindowsAPICodePack.Shell; using Microsoft.WindowsAPICodePack.Shell.PropertySystem; string filePath = @"C:/temp/example.docx"; var file = ShellFile.FromFilePath(filePath); // Read and Write: string[] oldAuthors = file.Properties.System.Author.Value; string oldTitle = file.Properties.System.Title.Value; file.Properties.System.Author.Value = new string[] { "Author #1", "Author #2" }; file.Properties.System.Title.Value = "Example Title"; // Alternate way to Write: ShellPropertyWriter propertyWriter = file.Properties.GetPropertyWriter(); propertyWriter.WriteProperty(SystemProperties.System.Author, new string[] { "Author" }); propertyWriter.Close();

Importante:

El archivo debe ser válido, creado por el software específico asignado. Cada tipo de archivo tiene propiedades específicas de archivos extendidos y no todos son modificables.

Si hace clic con el botón derecho en un archivo en el escritorio y no puede editar una propiedad, tampoco podrá editarlo en código.

Ejemplo:

  • Cree un archivo txt en el escritorio, cambie el nombre de su extensión a docx. No puede editar su propiedad de Author o Title .
  • Ábralo con Word, edítelo y guárdelo. Ahora usted puede.

Así que solo asegúrate de usar algunos try catch

Tema adicional: MSDN: Implementación de manejadores de propiedades


¡Gracias chicos por este hilo! Me ayudó cuando quería averiguar la versión del archivo de un exe. Sin embargo, necesitaba descubrir el último bit de lo que se llama Propiedades Extendidas.

Si abre propiedades de un archivo exe (o dll) en Windows Explorer, obtendrá una pestaña Versión y una vista de Propiedades extendidas de ese archivo. Quería acceder a uno de esos valores.

La solución para esto es el indexador de propiedades FolderItem.ExtendedProperty y si suelta todos los espacios en el nombre de la propiedad, obtendrá el valor. Por ejemplo, la versión del archivo va FileVersion, y ahí lo tienes.

Espero que esto ayude a los demás, solo pensé en agregar esta información a este hilo. ¡Aclamaciones!


Esta muestra en VB.NET lee todas las propiedades extendidas:

Sub Main() Dim arrHeaders(35) Dim shell As New Shell32.Shell Dim objFolder As Shell32.Folder objFolder = shell.NameSpace("C:/tmp") For i = 0 To 34 arrHeaders(i) = objFolder.GetDetailsOf(objFolder.Items, i) Next For Each strFileName In objfolder.Items For i = 0 To 34 Console.WriteLine(i & vbTab & arrHeaders(i) & ": " & objfolder.GetDetailsOf(strFileName, i)) Next Next End Sub

Debe agregar una referencia a Microsoft Shell Shell Controls and Automation desde la pestaña COM del cuadro de diálogo Referencias .



Método GetDetailsOf() : recupera detalles sobre un elemento en una carpeta. Por ejemplo, su tamaño, tipo o la hora de su última modificación. Las Propiedades del archivo pueden variar según la versión de Windows-OS .

List<string> arrHeaders = new List<string>(); Shell shell = new ShellClass(); Folder rFolder = shell.NameSpace(_rootPath); FolderItem rFiles = rFolder.ParseName(filename); for (int i = 0; i < short.MaxValue; i++) { string value = rFolder.GetDetailsOf(rFiles, i).Trim(); arrHeaders.Add(value); }


No estoy seguro de los tipos de archivos para los que está intentando escribir las propiedades, pero taglib-sharp es una excelente biblioteca de código abierto que completa muy bien esta funcionalidad. Tiene una gran cantidad de compatibilidad incorporada para la mayoría de los tipos de archivos de medios populares, pero también le permite realizar un etiquetado más avanzado con casi cualquier archivo.

EDITAR: He actualizado el enlace a taglib sharp. El viejo enlace ya no funcionaba.

EDITAR: actualizó el enlace una vez más por comentario de kzu.


Para aquellos que no están locos por VB, aquí está en c #:

Tenga en cuenta que debe agregar una referencia a Controles de Shell de Microsoft y Automatización desde la pestaña COM del cuadro de diálogo Referencias.

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( $"{i}/t{arrHeaders[i]}: {objFolder.GetDetailsOf(item, i)}"); } } }


La respuesta de Jerker es un poco más simple. Aquí hay un código de muestra que funciona desde MS :

var folder = new Shell().NameSpace(folderPath); foreach (FolderItem2 item in folder.Items()) { var company = item.ExtendedProperty("Company"); var author = item.ExtendedProperty("Author"); // Etc. }

Para aquellos que no pueden hacer referencia a shell32 estáticamente, puede invocarlo dinámicamente así:

var shellAppType = Type.GetTypeFromProgID("Shell.Application"); dynamic shellApp = Activator.CreateInstance(shellAppType); var folder = shellApp.NameSpace(folderPath); foreach (var item in folder.Items()) { var company = item.ExtendedProperty("Company"); var author = item.ExtendedProperty("Author"); // Etc. }


  • Después de ver una serie de soluciones en este hilo y en otro lugar, se armó el siguiente código. Esto es solo para leer una propiedad.
  • No pude hacer funcionar la función Shell32.FolderItem2.ExtendedProperty, se supone que toma un valor de cadena y devuelve el valor correcto y escribe para esa propiedad ... esto siempre fue nulo para mí y los recursos de referencia del desarrollador eran muy delgados.
  • WindowsApiCodePack parece haber sido abandonado por Microsoft, lo que nos trae el siguiente código.

Utilizar:

string propertyValue = GetExtendedFileProperty("c://temp//FileNameYouWant.ext","PropertyYouWant");

  1. Le devolverá el valor de la propiedad extendida que desee como una cadena para el nombre y el archivo dado.
  2. Solo bucles hasta que encuentre la propiedad especificada, no hasta que todas las propiedades se descubran como un código de muestra
  3. Funciona en versiones de Windows como Windows Server 2008 donde obtendrá el error "No se puede convertir el objeto COM de tipo ''System .__ ComObject'' al tipo de interfaz ''Shell32.Shell''" si solo intenta crear el objeto Shell32 normalmente.

    public static string GetExtendedFileProperty(string filePath, string propertyName) { string value = string.Empty; string baseFolder = Path.GetDirectoryName(filePath); string fileName = Path.GetFileName(filePath); //Method to load and execute the Shell object for Windows server 8 environment otherwise you get "Unable to cast COM object of type ''System.__ComObject'' to interface type ''Shell32.Shell''" Type shellAppType = Type.GetTypeFromProgID("Shell.Application"); Object shell = Activator.CreateInstance(shellAppType); Shell32.Folder shellFolder = (Shell32.Folder)shellAppType.InvokeMember("NameSpace", System.Reflection.BindingFlags.InvokeMethod, null, shell, new object[] { baseFolder }); //Parsename will find the specific file I''m looking for in the Shell32.Folder object Shell32.FolderItem folderitem = shellFolder.ParseName(fileName); if (folderitem != null) { for (int i = 0; i < short.MaxValue; i++) { //Get the property name for property index i string property = shellFolder.GetDetailsOf(null, i); //Will be empty when all possible properties has been looped through, break out of loop if (String.IsNullOrEmpty(property)) break; //Skip to next property if this is not the specified property if (property != propertyName) continue; //Read value of property value = shellFolder.GetDetailsOf(folderitem, i); } } //returns string.Empty if no value was found for the specified property return value; }