similar a los del explorador de windows en la visualizacion de detalles
Puedes utilizar la API de Windows para obtener exactamente los mismos datos que se muestran en las propiedades de las columnas del explorador de Windows.
Hay que implementar muchas interfaces para ello, así que para simplificarlo puedes instalar el paquete NuGet '
WindowsAPICodePAck' (de Microsoft) directamente en tu proyecto, y una vez instalado puedes utilizar la siguiente extensión de método que he escrito:
Friend Module FileSystemInfoExtensions
''' ----------------------------------------------------------------------------------------------------
''' <summary>
''' Gets the value of a <see cref="ShellProperty(Of T)"/> for the source <see cref="FileSystemInfo"/> object.
''' </summary>
''' ----------------------------------------------------------------------------------------------------
''' <param name="item">
''' A <see cref="FileSystemInfo"/> object that points to a file or directory.
''' </param>
'''
''' <param name="propertySelector">
''' Function to select the <see cref="ShellProperty(Of T)"/> for the source <see cref="FileSystemInfo"/> object.
''' </param>
''' ----------------------------------------------------------------------------------------------------
''' <returns>
''' The value of the <see cref="ShellProperty(Of T)"/> selected from <paramref name="propertySelector"/> parameter.
''' </returns>
''' ----------------------------------------------------------------------------------------------------
<DebuggerStepThrough>
<Extension>
<EditorBrowsable(EditorBrowsableState.Always)>
Public Function GetShellPropertyValue(Of T)(item As FileSystemInfo, propertySelector As Func(Of ShellObject, ShellProperty(Of T))) As T
Using shObj As ShellObject = ShellObject.FromParsingName(item.FullName)
Return propertySelector.Invoke(shObj).Value
End Using
End Function
End Module
Es suficiente versatil y sencillo de usar. Un ejemplo:
Dim mediaFile As New FileInfo("C:\Movie.mkv")
Dim title As String = mediaFile.GetShellPropertyValue(Function(shObj As ShellObject) shObj.Properties.System.Title)
Dim rawDuration As ULong? = mediaFile.GetShellPropertyValue(Function(shObj As ShellObject) shObj.Properties.System.Media.Duration)
Dim duration As TimeSpan = TimeSpan.FromTicks(rawDuration.GetValueOrDefault(0UL))
Console.WriteLine($"File name: {mediaFile.Name}; Title: {title}; Duration: {duration:hh\:mm\:ss}")
Resultado de ejecución:
File name: Movie.mkv; Title: El Último Mohicano; Duration: 01:46:15
Nótese que el valor de 'rawDuration' y 'duration' es la duración total incluyendo milisegundos. Me parece más eficiente así para poder trabajar con tiempos de duración exactos. Luego tú le puedes dar el formato de string deseado como hice en ese ejemplo para mostrar {horas:minutos:segundos} como se muestra en la columna del explorador de Windows.
De todas formas si quieres simplificar esa parte para obtener directamente una cadena de texto con el tiempo tal y como se muestra en la columna del explorador de Windows, puedes utilizar la función
ShellProperty.FormatForDisplay() especificando el valor
PropertyDescriptionFormatOptions.LongTime:
Dim duration As String = shObj.Properties.System.Media.Duration.FormatForDisplay(PropertyDescriptionFormatOptions.LongTime)
---
Como alternativa al uso de la librería 'WindowsAPICodePack', y si quieres un análisis más profundo de archivos multimedia, puedes utilizar la librería nativa de MediaInfo (
https://mediaarea.net/es/MediaInfo/Download/Windows ). Y también puedes utilizar la librería de FFMPEG, o puedes usar el programa por linea de comandos FFPROBE.exe (incluido en la build de FFMPEG) directamente para obtener la duración de video. De todo esto hay ejemplos en Internet, también para C# y los de MediaInfo creo recordar que tienen publicado una plantilla de implementación para VB.NET también.