ListView Directory Icon

C# で Directory を検索してアイコンを付けて表示します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. Directory を検索して ListView にアイコンを付けて表示してみましょう。
    ListView Directory に準じてプロジェクトを作成して下さい。
    アイコンの設定以外の説明はこのページを参照して下さい。
    CLI の環境で実行可能な完成したプログラムです。
    ファイル名 説明
    ListDirIcon.cs Directory を検索してアイコンを付けて表示
  2. ListDirIcon.cs のソースコードです。
    /*****************************************************/
    /*★ Directory List にアイコンを表示       前田 稔 ★*/
    /*****************************************************/
    using System;
    using System.Drawing;
    using System.Windows.Forms;
    using System.IO;
    
    public class MyForm : Form
    {
        ListView    listView1;
        int[]       width = { 360, 120, 80 };
        string[]    head = { "名前", "更新日付", "サイズ" };
        string      path = "c:\\Test";
        ImageList   imageListSmall = new ImageList();
    
        public MyForm()
        {
            InitializeComponent();
            Load += new System.EventHandler(MyForm_Load);
            Paint += new PaintEventHandler(MyHandler);
        }
    
        private void InitializeComponent()
        {
            this.listView1 = new System.Windows.Forms.ListView();
            this.SuspendLayout();
            // listView1
            this.listView1.Location = new System.Drawing.Point(12, 12);
            this.listView1.Name = "listView1";
            this.listView1.Size = new System.Drawing.Size(570, 232);
            this.listView1.TabIndex = 0;
            this.listView1.UseCompatibleStateImageBehavior = false;
            // MyForm
            this.ClientSize = new System.Drawing.Size(600, 256);
            this.Controls.Add(this.listView1);
            this.Name = "MyForm";
            this.ResumeLayout(false);
        }
    
        // ListViewコントロールを初期化します。
        private void MyForm_Load(object sender, System.EventArgs e)
        {
            listView1.FullRowSelect = true;
            listView1.GridLines = true;
            listView1.View = View.Details;
    
            ColumnHeader[] columnHead = new ColumnHeader[3];
            for (int i=0; i<3; i++)
            {   columnHead[i] = new ColumnHeader();
                columnHead[i].Width = width[i];
                columnHead[i].Text = head[i];
            }
            listView1.Columns.AddRange(columnHead);
        }
    
        // ListViewコントロールのデータを更新します。
        private void MyHandler(object sender, PaintEventArgs e)
        {
            listView1.Items.Clear();
            imageListSmall.Images.Clear();
            imageListSmall.Images.Add(new Bitmap("c:\\data\\test\\folder.ico"));
    
            imageListSmall.ImageSize = new Size(16, 16);
            listView1.SmallImageList = imageListSmall;
    
            path= System.Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
            DirectoryInfo di = new DirectoryInfo(path);         //パスを指定
            string[] item = new string[3];
    
            //ディレクトリ一覧の取得
            DirectoryInfo [] dis = di.GetDirectories("*.*");    //パターンを指定
            for(int i=0; i<dis.Length; i++)
            {   item[0]= dis[i].FullName;
                item[1]= dis[i].LastWriteTime.ToString();
                item[2]= "";
                listView1.Items.Add(new ListViewItem(item));
                listView1.Items[i].ImageIndex = 0;
            }
    
            //ファイル一覧の取得
            FileInfo [] fis = di.GetFiles("*.*");   //パターンを指定
            for( int i=0;i<fis.Length;i++)
            {   item[0]= fis[i].FullName;
                item[1]= fis[i].LastWriteTime.ToString();
                item[2]= fis[i].Length.ToString();
                listView1.Items.Add(new ListViewItem(item));
    
                Icon appIcon = System.Drawing.Icon.ExtractAssociatedIcon(fis[i].FullName);
                listView1.Items[listView1.Items.Count-1].ImageIndex = imageListSmall.Images.Count;
                imageListSmall.Images.Add(appIcon);
            }
        }
    }
    
    class form01
    {
        public static void Main()
        {
            MyForm mf = new MyForm();
            Application.Run(mf);
        }
    }
    
  3. path が検索するフォルダーで、初期値として "c:\\Test" が設定されています。
    imageListSmall がアイコンを格納する ImageList です。
        string      path = "c:\\Test";
        ImageList   imageListSmall = new ImageList();
        
  4. path に GetFolderPath() で DesktopDirectory を格納してみました。
    Desktop のフォルダーが検索されてアイコン付きで表示されます。
            path= System.Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
            DirectoryInfo di = new DirectoryInfo(path);         //パスを指定
        
  5. imageListSmall の最初にフォルダーアイコンを登録します。
    事前に "c:\\data\\test\\folder.ico" を用意して下さい。
    【注】Icon.ExtractAssociatedIcon ではフォルダーアイコンを取得出来ませんでした。
          そこで folder.ico を用意して ImageList の先頭に登録しています。
    
    アイコンのサイズを 16*16(small) にして ListView に設定します。
            imageListSmall.Images.Clear();
            imageListSmall.Images.Add(new Bitmap("c:\\data\\test\\folder.ico"));
    
            imageListSmall.ImageSize = new Size(16, 16);
            listView1.SmallImageList = imageListSmall;
        
  6. 検索したフォルダーには、登録済みのフォルダーアイコンを設定します。
                listView1.Items[i].ImageIndex = 0;
        
  7. Icon.ExtractAssociatedIcon() がファイルに関連付けられているアイコンを取得するメソッドです。
    このメソッドは、.NET Framework version 2.0 で新しく追加されたものです。
    取得したアイコンを imageListSmall に登録して ListView に設定します。
    ウインドウズエクスプローラと同様にファイルにアイコンが表示されます。
                Icon appIcon = System.Drawing.Icon.ExtractAssociatedIcon(fis[i].FullName);
                listView1.Items[listView1.Items.Count-1].ImageIndex = imageListSmall.Images.Count;
                imageListSmall.Images.Add(appIcon);
        

超初心者のプログラム入門(C# Frame Work)