using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Runtime.InteropServices;
namespace WindowsFormsApplication2
{    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }        private void Form1_Load(object sender, EventArgs e)
        {
            //fillListView(listView1, @"");
            textBox1.Text = @"F:\魔兽争霸";
            
        }
        private void fillListView(ListView lv, string strPath)
        {
            DirectoryInfo directory = new DirectoryInfo(strPath);
            lv.Items.Clear();
            foreach (DirectoryInfo dir in directory.GetDirectories())
            {
                ListViewItem item = new ListViewItem(dir.Name);
                item.SubItems.Add(string.Empty);
                item.SubItems.Add("文件夹");
                item.SubItems.Add(string.Empty);
                lv.Items.Add(item);
            }
            foreach (FileInfo file in directory.GetFiles())
            {
                ListViewItem item = new ListViewItem(file.Name);
                item.SubItems.Add((file.Length / 1024).ToString() + "   KB");
                item.SubItems.Add(file.Extension + "文件");
                item.SubItems.Add(file.LastWriteTime.ToString());
                lv.Items.Add(item);
            }
        }        private void button1_Click(object sender, EventArgs e)
        {
            if (textBox1.Text.Length==0)
            {
                folderBrowserDialog1.ShowDialog();
                textBox1.Text = folderBrowserDialog1.SelectedPath;
            }
            LoadFiles(textBox1.Text);
        }        private void LoadFiles(string Path)
        {
            listView1.Items.Clear();
            DirectoryInfo directory = new DirectoryInfo(Path);
            foreach (DirectoryInfo dir in directory.GetDirectories())
            {
                SHFILEINFO shinfo = new SHFILEINFO();
                Win32.SHGetFileInfo(dir.FullName, 
                                    (uint)0x80,
                                    ref shinfo,
                                    (uint)System.Runtime.InteropServices.Marshal.SizeOf(shinfo),
                                    (uint)(0x100 | 0x400));
                System.Drawing.Icon myIcon = System.Drawing.Icon.FromHandle(shinfo.hIcon);
                if (imageList1.Images[".Directory"] == null)
                {
                    imageList1.Images.Add(".Directory", myIcon);
                }                ListViewItem item = new ListViewItem(dir.Name);
                item.ImageIndex = imageList1.Images.IndexOfKey(".Directory");                item.SubItems.Add(string.Empty);
                item.SubItems.Add("文件夹");
                item.SubItems.Add(string.Empty);
                item.SubItems.Add(dir.FullName);
                listView1.Items.Add(item);
            }
            foreach (FileInfo file in directory.GetFiles())
            {
                SHFILEINFO shinfo = new SHFILEINFO();
                Win32.SHGetFileInfo(file.FullName, 0, ref shinfo, (uint)Marshal.SizeOf(shinfo), Win32.SHGFI_ICON | Win32.SHGFI_SMALLICON);
                System.Drawing.Icon myIcon = System.Drawing.Icon.FromHandle(shinfo.hIcon);
                if (imageList1.Images[file.Extension]==null)
                {
                    imageList1.Images.Add(file.Extension, myIcon);
                }
                               ListViewItem item = new ListViewItem(file.Name);                item.ImageIndex = imageList1.Images.IndexOfKey(file.Extension);
                item.SubItems.Add((file.Length / 1024).ToString() + "KB");
                item.SubItems.Add(file.Extension);
                item.SubItems.Add(file.LastWriteTime.ToString());
                listView1.Items.Add(item);
            }        }        private void listView1_DoubleClick(object sender, EventArgs e)
        {
            
            //listView1.SelectedItems[0]
            //if (listView1.SelectedItems[1].Text=="文件夹")
            //{
            //    MessageBox.Show("下一层");
                
            //}
        }
               }
    [StructLayout(LayoutKind.Sequential)]
    public struct SHFILEINFO
    {
        public IntPtr hIcon;
        public IntPtr iIcon;
        public uint dwAttributes;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
        public string szDisplayName;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
        public string szTypeName;
    }    /// <summary>
    /// 定义调用的API方法
    /// </summary>
    public class Win32
    {
        public const uint SHGFI_ICON = 0x100;
        public const uint SHGFI_LARGEICON = 0x0; // 'Large icon
        public const uint SHGFI_SMALLICON = 0x1; // 'Small icon        [DllImport("shell32.dll")]
        public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags);
        [DllImport("shell32.dll")]
        public static extern uint ExtractIconEx(string lpszFile, int nIconIndex, int[] phiconLarge, int[] phiconSmall, uint nIcons);        [DllImport("User32.dll")]
        public static extern int MessageBox(int h, string m, string c, int type);        [DllImport("User32.dll", EntryPoint = "DestroyIcon")]
        public static extern int DestroyIcon(IntPtr hIcon);    }
     }