文件图标和列表视图

时间:2010-01-18 13:23:11

标签: vb.net

如何检索与文件类型关联的文件图标,并将其与vb.net中的Listview项目一起添加

我读到了关于SHGetFileInfo的内容,但我对此不了解

请给我解决方案或请解释我的系统与.net控件的详细信息

2 个答案:

答案 0 :(得分:6)

抬头SHGetFileInfo我可以看到你为什么对它感到困惑,但我认为对于我认为你想要做的事情可能有点过分,即枚举文件夹的内容和添加项目列表视图。

如果我们有一个包含ListView和ImageList的表单,并且通过将ListView的LargeImageList属性设置为ImageList来关联这两个,那么我们将如何将文件夹的内容放入ListView,其中的图标来自每个文件的关联EXE文件。

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来自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

在所有这些结束时,当您在此文件夹上运行此代码时: alt text http://www.philippursglove.com/stackoverflow/listview1.png 你应该得到:
alt text http://www.philippursglove.com/stackoverflow/listview2.png

答案 1 :(得分:-1)

如果您知道所需文件的文件名,则可以使用System.Drawing.Icon.ExtractAssociatedIcon功能。 e.g。

Icon ico = System.Drawing.Icon.ExtractAssociatedIcon(@"C:\WINDOWS\system32\notepad.exe");

您还可以参考我对related question的回答,了解更多实施细节。