简体   繁体   中英

Listview - add File type & Last modified Subitems

I'm trying to add "file type" and "last modified" to my Listview when adding items in It same as in Explorer, but I don't find what property should be assigned to SubItem. Here is my code:

For Each MyFile As IO.FileInfo In ItemDirectory.GetFiles

    Dim lvi As New ListViewItem

    lvi.Tag = mFile.FullName
    lvi.Text = mFile.Name
    lvi.ImageKey = CacheShellIcon(mFile.FullName)

    Listview1.Items.Add(lvi)
    lvi.SubItems.Add("File type ??")
    lvi.SubItems.Add(mFile.LastAccessTime.ToShortDateString & " " & mFile.LastAccessTime.ToShortTimeString) 'This isn't same as last modified ? 
 Next

If somebody knows how to do It please let me know, I want to have this in my Details view.

For filetype you can use lvi.SubItems.Add(MyFile.Extension) and for the "last modified" date, of course the last modified! :D lvi.SubItems.Add(MyFile.LastWriteTime.ToShortDateString)

Last write and last access are not the same ;)

The linked answer provides an all-purpose way to get all the extended properties. With 300+ elements in newer Windows versions it is clearly overkill to fetch them all if you are only interested in one or two. This returns just the file type. A better approach might be to pass a "shopping list" of desired property names.

As before, you need to add a reference to Microsoft Shell Controls and Automation or Microsoft Shell Folder View Router based on your OS version.

Imports Shell32
Imports SHDocVw

Partial Friend Class Shell32Methods

    Friend Shared Function GetShellFileProperty(filepath As String, index As Int32) As String
        Dim shell As New Shell32.Shell
        Dim shFolder As Shell32.Folder
        shFolder = shell.NameSpace(Path.GetDirectoryName(filepath))

        ' get shell data for this file, cast to folder item
        Dim shFolderItem = DirectCast(shFolder.Items().Item(Path.GetFileName(filepath)), 
                            Shell32.ShellFolderItem)

        If shFolderItem IsNot Nothing Then
            Return shFolder.GetDetailsOf(shFolderItem, index)
        Else
            Return String.Empty
        End If
    End Function
        ...
End Class

Usage:

Dim lvi As ListViewItem
Dim fileType As String

For Each f As String In Directory.EnumerateFiles("C:\Temp\ShellTest")
    fileType = Shell32Methods.GetShellFileProperty(f, 9)

    lvi = New ListViewItem
    lvi.Text = Path.GetFileName(f)
    lvi.SubItems.Add(fileType)
    lvFiles.Items.Add(lvi)

Next

在此处输入图片说明

Ideally, you'd want to create an Enum for the properties so the code could avoid magic numbers:

fileType = Shell32Methods.GetShellFileProperty(f, Shell32FileProps.FileType)

As noted elsewhere, the index of the ones >260 or so can change depending on the OS version. That could be easily modified to accept an Enum/Int array and return a list of values so as to prevent iterating all 300+ propertied to get one or three.

I figured out another solution, I think this one is easier, at least for me :

 Public Function ExProperty(filepath As String, PropertyItem As Integer)
        Dim arrHeaders As New List(Of String)()

        Dim shell As New Shell
        Dim rFolder As Folder = shell.[NameSpace](Path.GetDirectoryName(filepath))
        Dim rFiles As FolderItem = rFolder.ParseName(Path.GetFileName(filepath))

        'I needed only File type so I looped to 2 only (2 is the file type in my case - Windows 10 - 
        ' to see all available properties do a loop 
        ' 0 To Short.MaxValue - 1" and then extract whatever property you like)
                    For i As Integer = 0 To 2
                        Dim value As String = rFolder.GetDetailsOf(rFiles, i).Trim()
                        arrHeaders.Add(value)
                    Next

        Dim DesiredProperty As String
        DesiredProperty = arrHeaders.Item(PropertyItem)

        Return DesiredProperty

 End Function

Usage with Listview just simply (this adds File type subitem):

Listview1_Item.SubItems.Add(ExProperty(filepath, 2))

As in all solutions, a reference to Microsoft Shell Controls and Automation must be set.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM