tags:

views:

243

answers:

1

How to retrieve file icons associated with the file types and add them with the items of Listview in vb.net

i read about SHGetFileInfo but i didnt understand anything from that

please give me solution or please explain me ho system works with the .net controls in details :( please help me

+1  A: 

Having looked up SHGetFileInfo I can see why you're confused by it, but I think it might be slightly overkill for what I think you're trying to do i.e. enumerating the contents of a folder and adding items to the Listview.

If we have a form that contains a ListView and an ImageList, with the two related by having the ListView's LargeImageList property set to the ImageList, then here's how we put the contents of a folder into the ListView with the icons coming from the associated EXE file for each file.

Imports System.IO
Imports System.Drawing

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    Dim dirInfo As DirectoryInfo
    Dim fileInfo As FileInfo
    Dim exePath As String
    Dim exeIcon As Icon

    dirInfo = New DirectoryInfo(path_to_some_folder

    'We use this For...Each to iterate over the collection of files in the folder
    For Each fileInfo In dirInfo.GetFiles
        'We can only find associated exes by extension, so don't show any files that have no extension
        If fileInfo.Extension = String.Empty Then
        Else
            'Use the function to get the path to the executable for the file
            exePath = GetAssociatedProgram(fileInfo.Extension)

            'Use ExtractAssociatedIcon to get an icon from the path
            exeIcon = Drawing.Icon.ExtractAssociatedIcon(exePath)

            'Add the icon if we haven't got it already, with the executable path as the key
            If ImageList1.Images.ContainsKey(exePath) Then
            Else
                ImageList1.Images.Add(exePath, exeIcon)
            End If

            'Add the file to the ListView, with the executable path as the key to the ImageList's image
            ListView1.Items.Add(fileInfo.Name, exePath)
        End If
    Next

End Sub

GetAssociatedProgram comes from developer.com

Public Function GetAssociatedProgram(ByVal FileExtension As _
   String) As String


    ' Returns the application associated with the specified
    ' FileExtension
    ' ie, path\denenv.exe for "VB" files
    Dim objExtReg As Microsoft.Win32.RegistryKey = _
         Microsoft.Win32.Registry.ClassesRoot
    Dim objAppReg As Microsoft.Win32.RegistryKey = _
        Microsoft.Win32.Registry.ClassesRoot
    Dim strExtValue As String
    Try
        ' Add trailing period if doesn't exist
        If FileExtension.Substring(0, 1) <> "." Then _
            FileExtension = "." & FileExtension
        ' Open registry areas containing launching app details
        objExtReg = objExtReg.OpenSubKey(FileExtension.Trim)
        strExtValue = objExtReg.GetValue("").ToString
        objAppReg = objAppReg.OpenSubKey(strExtValue & _
                        "\shell\open\command")
        ' Parse out, tidy up and return result
        Dim SplitArray() As String
        SplitArray = Split(objAppReg.GetValue(Nothing).ToString, """")
        If SplitArray(0).Trim.Length > 0 Then
            Return SplitArray(0).Replace("%1", "")
        Else
            Return SplitArray(1).Replace("%1", "")
        End If
    Catch
        Return ""
    End Try
End Function

At the end of all of that, when you run this code on this folder: alt text you should get:
alt text

PhilPursglove
exeIcon = Drawing.Icon.ExtractAssociatedIcon(exePath) for this statement its giving me exception of The path is not of legel form
shraddha
I can get that exception if one of the files in the folder has no extension. In which case you need to either exclude files with no extension (I've edited my answer to show this), or you need to add a blank file icon to the ImageList and then use that icon for any files with no extension.
PhilPursglove