A File Explore Clone : File Explore : GUI Windows Forms C# Examples


C# Examples » GUI Windows Forms » File Explore »

 

A File Explore Clone









    
/*  Quote  from  

Programming  .NET  Windows  Applications

By  Jesse  Liberty,  Dan  Hurwitz
First  Edition  October  2003  
Pages:  1246  (More  details)
*/

using  System;
using  System.Drawing;
using  System.Collections;
using  System.ComponentModel;
using  System.Windows.Forms;
using  System.Data;
using  System.IO;
using  System.Diagnostics;        //    for  Process.Start

namespace  csExplorerClone
{
    public  class  Form1  :  System.Windows.Forms.Form
    {
        private  System.Windows.Forms.Splitter  splitter1;
        private  System.Windows.Forms.ListView  lv;
        private  System.Windows.Forms.TreeView  tvw;
        private  System.Windows.Forms.MainMenu  mainMenu1;
        private  System.Windows.Forms.MenuItem  menuItem1;
        private  System.Windows.Forms.MenuItem  mnuSmallIcons;
        private  System.Windows.Forms.MenuItem  mnuLargeIcons;
        private  System.Windows.Forms.MenuItem  mnuList;
        private  System.Windows.Forms.MenuItem  mnuDetails;
        
        public  enum  ColumnType
        {
            Alpha,
            Numeric,
            DateTimeValue
        }

        ///  <summary>
        ///  Required  designer  variable.
        ///  </summary>
        private  System.ComponentModel.Container  components  =  null;

        public  Form1()
        {
            InitializeComponent();

            //    Similar  to  TreeViews  program
            //    Use  an  array  to  add  filenames  to  the  ImageLists
            String[]  arFiles  =  {
                @"C:\Program  Files\Microsoft  Visual  Studio  .NET\Common7\"  +  
                                @"Graphics\icons\computer\form.ico",
                @"C:\Program  Files\Microsoft  Visual  Studio  .NET\Common7\"  +  
                                @"Graphics\icons\win95\clsdfold.ico",  
                @"C:\Program  Files\Microsoft  Visual  Studio  .NET\Common7\"  +  
                                @"Graphics\icons\win95\openfold.ico",  
                @"C:\Program  Files\Microsoft  Visual  Studio  .NET\Common7\"  +  
                                @"Graphics\bitmaps\assorted\happy.bmp",
                @"C:\Program  Files\Microsoft  Visual  Studio  .NET\Common7\"  +  
                                @"Graphics\bitmaps\outline\NoMask\doc.bmp",
                @"C:\Program  Files\Microsoft  Visual  Studio  .NET\Common7\"  +  
                                @"Graphics\bitmaps\outline\NoMask\exe.bmp",
                @"C:\Program  Files\Microsoft  Visual  Studio  .NET\Common7\"  +  
                                @"Graphics\bitmaps\outline\NoMask\txt.bmp",
                @"C:\Program  Files\Microsoft  Visual  Studio  .NET\Common7\"  +  
                                @"Graphics\bitmaps\outline\NoMask\windoc.bmp"
                };
            ImageList  imgListSmall  =  new  ImageList();    //    default  size  16x16
            ImageList  imgListLarge  =  new  ImageList();
            imgListLarge.ImageSize  =  new  Size(32,32);
            for  (int  i  =  0;  i  <  arFiles.Length;  i++)
            {
                imgListSmall.Images.Add(Image.FromFile(arFiles[i]));        
                imgListLarge.Images.Add(Image.FromFile(arFiles[i]));        
            }

            tvw.Size  =  new  Size(ClientSize.Width  /  3,  ClientSize.Height);
            tvw.BackColor  =  Color.Moccasin;
            tvw.HideSelection  =  false;    
            tvw.ImageList  =  imgListSmall;
            tvw.ImageIndex  =  1;
            tvw.SelectedImageIndex  =  2;
            //    End  similar  to  TreeViews  program

            lv.BackColor  =  Color.PaleTurquoise;
            lv.ForeColor  =  Color.DarkBlue;
            lv.HideSelection  =  false;
            lv.SmallImageList  =  imgListSmall;
            lv.LargeImageList  =  imgListLarge;
            lv.View  =  View.SmallIcon;
            lv.Activation  =  ItemActivation.Standard;    //  default
            lv.MultiSelect  =  true;            //  default
            lv.HoverSelection  =  false;        //  default
            lv.Sorting  =  SortOrder.None;    //  default
            lv.AllowColumnReorder  =  true;
            lv.FullRowSelect  =  true;
            lv.GridLines  =  true;
            lv.HeaderStyle  =  ColumnHeaderStyle.Clickable;        //  default
            lv.LabelEdit  =  true;
            
            //    Similar  to  TreeViews  program
            //    Fill  the  directory  tree
            FillDirectoryTree();
        }

        //    These  3  methods  essentially  same  as  in  TreeViews  program
        private  void  FillDirectoryTree()
        {
            //    Populate  with  the  contents  of  the  local  hard  drive.

            //    Suppress  redraw  until  tree  view  is  complete
            tvw.BeginUpdate();

                      //    First  clear  all  the  nodes.
            tvw.Nodes.Clear();

            //    Get  the  logical  drives  and  put  them  into  the  root  nodes.
            //    Fill  an  array  with  all  the  logical  drives  on  the  machine.
            string[]  strDrives  =  Environment.GetLogicalDrives();

            //    Iterate  through  the  drives,  adding  them  to  the  tree.
            //    Use  a  try/catch  block,  so  if  a  drive  is  not  ready,  
            //    e.g.  an  empty  floppy  or  CD,  it  will  not  be  added  to  the  tree.
                        foreach  (string  rootDirectoryName  in  strDrives)
                      {
                try  
                {
                    //    Find  all  the  first  level  subdirectories.
                    //    If  the  drive  is  not  ready,  this  will  throw  an  
                    //    exception,  which  will  have  the  effect  of  
                    //    skipping  that  drive.
                    Directory.GetDirectories(rootDirectoryName);

                    //    Create  a  node  for  each  root  directory
                    TreeNode  ndRoot  =  new  TreeNode(rootDirectoryName);

                    //    Add  the  node  to  the  tree
                    tvw.Nodes.Add(ndRoot);
  
                    //    Set  colors  based  on  Index  property.
                      //    Index  not  set  until  after  node  added  to  collection.
                    if  (ndRoot.Index  %  2  ==  0)
                    {
                        ndRoot.BackColor  =  Color.LightYellow;
                        ndRoot.ForeColor  =  Color.Green;
                    }

                    //    Add  subdirectory  nodes.
                    //    Hard  code  getFileNames  to  false.
                    GetSubDirectoryNodes(ndRoot,  false);
                }
                catch    (System.IO.IOException)
                {
                    //    let  it  through
                            }
                catch    (Exception  e)
                {
                                //    Catch  any  other  errors.
                    MessageBox.Show(e.Message);
                            }
            }
                  
                    tvw.EndUpdate();
                  
        }            //    close  FillDirectoryTree

        private  void  GetSubDirectoryNodes(TreeNode  parentNode,  
                                                    bool  getFileNames)
        {
            //    Exit  this  method  if  the  node  is  not  a  directory.
            DirectoryInfo  di  =  new  DirectoryInfo(parentNode.FullPath);
            if  ((di.Attributes  &  FileAttributes.Directory)  ==  0)
            {
                return;
            }

                      //    Clear  all  the  nodes  in  this  node.
            parentNode.Nodes.Clear();

            //    Get  an  array  of  strings  containing  all  the  subdirectories  in  the  parent  node.
            string[]  arSubs  =  Directory.GetDirectories(parentNode.FullPath);

            //    Add  a  child  node  for  each  subdirectory.
            foreach  (string  subDir  in  arSubs)
            {
                            DirectoryInfo  dirInfo  =  new  DirectoryInfo(subDir);
                            //  do  not  show  hidden  folders
                            if  ((dirInfo.Attributes  &  FileAttributes.Hidden)!=  0)
                            {
                                  continue;
                            }

                TreeNode  subNode  =  new  TreeNode(dirInfo.Name);
                parentNode.Nodes.Add(subNode);
                        
                //    Set  colors  based  on  Index  property.
                if  (subNode.Index  %  2  ==  0)
                    subNode.BackColor  =  Color.LightPink;
            }

//    This  section  of  code  is  never  called  in  this  program.    Vestigial  from  TreeViews.cs
//            if  (getFileNames)
//            {
//                            //    Get  any  files  for  this  node.
//                            string[]  files  =  Directory.GetFiles(parentNode.FullPath);
//
//                            //  After  placing  the  nodes,  
//                            //  now  place  the  files  in  that  subdirectory.
//                            foreach  (string  str  in  files)
//                            {
//                    FileInfo  fi  =  new  FileInfo(str);
//                    TreeNode  fileNode  =  new  TreeNode(fi.Name);
//                    parentNode.Nodes.Add(fileNode);
//
//                    //    Set  the  icon
//                    fileNode.ImageIndex  =  0;
//                    fileNode.SelectedImageIndex  =  3;
//
//                    //    Set  colors  based  on  Index  property.
//                    if  (fileNode.Index  %  2  ==  0)
//                        fileNode.BackColor  =  Color.LightGreen;
//                            }
//            }
        }    //  close  GetSubDirectoryNodes

        private  void  tvw_BeforeExpand(object  sender,  
                                    TreeViewCancelEventArgs  e)
        {
            tvw.BeginUpdate();
            foreach  (TreeNode  tn  in  e.Node.Nodes)
            {
                GetSubDirectoryNodes(tn,  false);
            }
            tvw.EndUpdate();            
        }        

        
        //  This  populates  the  list  view  after  a  tree  node  is  selected
        private  void  tvw_AfterSelect(object  sender,  
                                    TreeViewEventArgs  e)
        {
            lv.Clear();
            lv.BeginUpdate();
            
            DirectoryInfo  di  =  new  DirectoryInfo(e.Node.FullPath);
            FileSystemInfo[]  afsi  =  di.GetFileSystemInfos();
            foreach  (FileSystemInfo  fsi  in  afsi)
            {
                ListViewItem  lvi  =  new  ListViewItem(fsi.Name);
                
                if  ((fsi.Attributes  &  FileAttributes.Directory)  !=  0)
                {
                    lvi.ImageIndex  =  1;
                    lvi.SubItems.Add("");            //  Bytes  subitem
                }
                else
                {
                    switch(fsi.Extension.ToUpper())
                    {
                        case  ".DOC"  :
                            lvi.ImageIndex  =  4;
                            break;
                        case  ".EXE"  :
                            lvi.ImageIndex  =  5;
                            break;
                        case  ".TXT"  :
                            lvi.ImageIndex  =  6;
                            break;
                        default  :
                            lvi.ImageIndex  =  7;
                            break;
                    }
                    //    Bytes  subitem,  w/  commas
                    //    Cast  FileSystemInfo  object  to  FileInfo  object  so  the  
                    //        size  can  be  obtained.
                    lvi.SubItems.Add(((FileInfo)fsi).Length.ToString("N0"));
                }

                //    Add  the  remaining  subitems  to  the  ListViewItem
                lvi.SubItems.Add(fsi.Extension);                        //  type
                lvi.SubItems.Add(fsi.LastWriteTime.ToString());    //  modified

                //    Build  up  the  Attributes  string
                string  strAtt  =  "";
                if  ((fsi.Attributes  &  FileAttributes.ReadOnly)  !=  0)
                    strAtt  +=  "R";
                if  ((fsi.Attributes  &  FileAttributes.Hidden)  !=  0)
                    strAtt  +=  "H";
                if  ((fsi.Attributes  &  FileAttributes.System)  !=  0)
                    strAtt  +=  "S";
                if  ((fsi.Attributes  &  FileAttributes.Archive)  !=  0)
                    strAtt  +=  "A";
                lvi.SubItems.Add(strAtt);                //  attributes

                lv.Items.Add(lvi);
            }    //    end  foreach
            
            lv.Columns.Add("Name",  150,  HorizontalAlignment.Left);
            lv.Columns.Add("Bytes",  75,  HorizontalAlignment.Right);
            lv.Columns.Add("Ext.",  50,  HorizontalAlignment.Left);
            lv.Columns.Add("Modified",  125,  HorizontalAlignment.Left);
            lv.Columns.Add("Attrib.",  50,  HorizontalAlignment.Left);
            
            lv.EndUpdate();
        }                                //    close  tvw_AfterSelect

        
        private  void  mnuView_Click(object  sender,  EventArgs  e)
        {
            MenuItem  mnu  =  (MenuItem)sender;
            switch  (mnu.Mnemonic.ToString())
            {
                case  "L"    :        //    Large  Icons    
                    lv.View  =  View.LargeIcon;
                    break;
                case  "S"    :        //    Small  Icons
                    lv.View  =  View.SmallIcon;
                    break;
                case  "T"  :        //    List  view
                    lv.View  =  View.List;
                    break;
                case  "D"  :        //    Detail  view
                    lv.View  =  View.Details;
                    break;
            }
        }

        protected  override  void  Dispose(  bool  disposing  )
        {
            if(  disposing  )
            {
                if  (components  !=  null)  
                {
                    components.Dispose();
                }
            }
            base.Dispose(  disposing  );
        }

        #region  Windows  Form  Designer  generated  code
        ///  <summary>
        ///  Required  method  for  Designer  support  -  do  not  modify
        ///  the  contents  of  this  method  with  the  code  editor.
        ///  </summary>
        private  void  InitializeComponent()
        {
            this.tvw  =  new  System.Windows.Forms.TreeView();
            this.splitter1  =  new  System.Windows.Forms.Splitter();
            this.lv  =  new  System.Windows.Forms.ListView();
            this.mainMenu1  =  new  System.Windows.Forms.MainMenu();
            this.menuItem1  =  new  System.Windows.Forms.MenuItem();
            this.mnuSmallIcons  =  new  System.Windows.Forms.MenuItem();
            this.mnuLargeIcons  =  new  System.Windows.Forms.MenuItem();
            this.mnuList  =  new  System.Windows.Forms.MenuItem();
            this.mnuDetails  =  new  System.Windows.Forms.MenuItem();
            this.SuspendLayout();
            //  
            //  tvw
            //  
            this.tvw.Dock  =  System.Windows.Forms.DockStyle.Left;
            this.tvw.ImageIndex  =  -1;
            this.tvw.Name  =  "tvw";
            this.tvw.SelectedImageIndex  =  -1;
            this.tvw.Size  =  new  System.Drawing.Size(168,  600);
            this.tvw.TabIndex  =  0;
            this.tvw.AfterSelect  +=  new  System.Windows.Forms.TreeViewEventHandler(this.tvw_AfterSelect);
            this.tvw.BeforeExpand  +=  new  System.Windows.Forms.TreeViewCancelEventHandler(this.tvw_BeforeExpand);
            //  
            //  splitter1
            //  
            this.splitter1.Location  =  new  System.Drawing.Point(168,  0);
            this.splitter1.Name  =  "splitter1";
            this.splitter1.Size  =  new  System.Drawing.Size(3,  600);
            this.splitter1.TabIndex  =  1;
            this.splitter1.TabStop  =  false;
            //  
            //  lv
            //  
            this.lv.Dock  =  System.Windows.Forms.DockStyle.Fill;
            this.lv.Location  =  new  System.Drawing.Point(171,  0);
            this.lv.Name  =  "lv";
            this.lv.Size  =  new  System.Drawing.Size(429,  600);
            this.lv.TabIndex  =  2;
            this.lv.ItemActivate  +=  new  System.EventHandler(this.lv_ItemActivate);
            this.lv.AfterLabelEdit  +=  new  System.Windows.Forms.LabelEditEventHandler(this.lv_AfterLabelEdit);
            this.lv.ColumnClick  +=  new  System.Windows.Forms.ColumnClickEventHandler(this.lv_ColumnClick);
            this.lv.BeforeLabelEdit  +=  new  System.Windows.Forms.LabelEditEventHandler(this.lv_BeforeLabelEdit);
            //  
            //  mainMenu1
            //  
            this.mainMenu1.MenuItems.AddRange(new  System.Windows.Forms.MenuItem[]  {
                                                                                                              this.menuItem1});
            //  
            //  menuItem1
            //  
            this.menuItem1.Index  =  0;
            this.menuItem1.MenuItems.AddRange(new  System.Windows.Forms.MenuItem[]  {
                                                                                                              this.mnuSmallIcons,
                                                                                                              this.mnuLargeIcons,
                                                                                                              this.mnuList,
                                                                                                              this.mnuDetails});
            this.menuItem1.Text  =  "&View";
            //  
            //  mnuSmallIcons
            //  
            this.mnuSmallIcons.Index  =  0;
            this.mnuSmallIcons.Text  =  "&Small  Icons";
            this.mnuSmallIcons.Click  +=  new  System.EventHandler(this.mnuView_Click);
            //  
            //  mnuLargeIcons
            //  
            this.mnuLargeIcons.Index  =  1;
            this.mnuLargeIcons.Text  =  "&Large  Icons";
            this.mnuLargeIcons.Click  +=  new  System.EventHandler(this.mnuView_Click);
            //  
            //  mnuList
            //  
            this.mnuList.Index  =  2;
            this.mnuList.Text  =  "Lis&t";
            this.mnuList.Click  +=  new  System.EventHandler(this.mnuView_Click);
            //  
            //  mnuDetails
            //  
            this.mnuDetails.Index  =  3;
            this.mnuDetails.Text  =  "&Details";
            this.mnuDetails.Click  +=  new  System.EventHandler(this.mnuView_Click);
            //  
            //  Form1
            //  
            this.AutoScaleBaseSize  =  new  System.Drawing.Size(5,  13);
            this.ClientSize  =  new  System.Drawing.Size(600,  600);
            this.Controls.AddRange(new  System.Windows.Forms.Control[]  {
                                                                                              this.lv,
                                                                                              this.splitter1,
                                                                                              this.tvw});
            this.Menu  =  this.mainMenu1;
            this.Name  =  "Form1";
            this.Text  =  "Form1";
            this.ResumeLayout(false);

        }
        #endregion

        [STAThread]
        static  void  Main()  
        {
            Application.Run(new  Form1());
        }


        private  void  lv_ItemActivate(object  sender,  EventArgs  e)
        {
            ListView  lv  =  (ListView)sender;
            foreach  (ListViewItem  lvi  in  lv.SelectedItems)
            {
                try
                {
                    Process.Start(tvw.SelectedNode.FullPath  +  "\\"  +  lvi.Text);
                }
                catch
                {
                }
            }
        }

        public  class  SortListViewItems  :  IComparer        //    nested  class
        {
            int  columnIndex;
            ColumnType  columnType;
            bool  isAscending;
            public  static  Boolean  isNameAscending  =  true;
            public  static  Boolean  isBytesAscending  =  false;
            public  static  Boolean  isExtAscending  =  false;
            public  static  Boolean  isModifiedAscending  =  false;
            public  static  Boolean  isAttribAscending  =  false;
            
            public  SortListViewItems(int  columnIndex,  
                                            ColumnType  columnType,  
                                            bool  isAscending)
            {
                this.columnIndex  =  columnIndex;
                this.columnType  =  columnType;
                this.isAscending  =  isAscending;
            }
        
            public  int  Compare(object  x,  object  y)
            {
                string  strFirst  =  
                    ((ListViewItem)x).SubItems[columnIndex].Text;
                string  strSecond  =  
                    ((ListViewItem)y).SubItems[columnIndex].Text;
                
                switch  (columnType)
                {
                    case  ColumnType.Alpha  :
                        if  (isAscending)
                            return  strFirst.CompareTo(strSecond);
                        else
                            return  strSecond.CompareTo(strFirst);
                        
                    case  ColumnType.DateTimeValue  :
                        if  (isAscending)
                            return  
                                DateTime.Parse(strFirst).
                                    CompareTo(DateTime.Parse(strSecond));
                        else
                            return  
                                DateTime.Parse(strSecond).
                                    CompareTo(DateTime.Parse(strFirst));
                        
                    case  ColumnType.Numeric  :
                        //    Special  case  blank  byte  values.
                        if  (strFirst  ==  "")
                            strFirst  =  "-1";
                        if  (strSecond  ==  "")
                            strSecond  =  "-1";
                    
                        if  (isAscending)
                            return  
                                Double.Parse(strFirst).
                                    CompareTo(Double.Parse(strSecond));
                        else
                            return  
                                Double.Parse(strSecond).
                                    CompareTo(Double.Parse(strFirst));
                        
                    default:
                        return  0;            
                }            //    close  switch  block    
            }                //    close  Compare  method
        }                    //    close  nested  SortListViewItems  class

        private  void  lv_ColumnClick(object  sender,  ColumnClickEventArgs  e)
        {
            ColumnType  columnType;
            bool  isAscending  =  true;
            string  strName  =  ((ListView)sender).Columns[e.Column].Text;
            switch(strName)
            {
                case  "Name":  
                    columnType  =  ColumnType.Alpha;
                    SortListViewItems.isNameAscending  =  
                            !SortListViewItems.isNameAscending;
                    isAscending  =  SortListViewItems.isNameAscending;
                    break;
                case  "Bytes":  
                    columnType  =  ColumnType.Numeric;
                    SortListViewItems.isBytesAscending  =  
                            !SortListViewItems.isBytesAscending;
                    isAscending  =  SortListViewItems.isBytesAscending;
                    break;
                case  "Ext.":  
                    columnType  =  ColumnType.Alpha;
                    SortListViewItems.isExtAscending  =  
                            !SortListViewItems.isExtAscending;
                    isAscending  =  SortListViewItems.isExtAscending;
                    break;
                case  "Modified":  
                    columnType  =  ColumnType.DateTimeValue;
                    SortListViewItems.isModifiedAscending  =  
                            !SortListViewItems.isModifiedAscending;
                    isAscending  =  SortListViewItems.isModifiedAscending;
                    break;
                case  "Attrib.":  
                    columnType  =  ColumnType.Alpha;
                    SortListViewItems.isAttribAscending  =  
                            !SortListViewItems.isAttribAscending;
                    isAscending  =  SortListViewItems.isAttribAscending;
                    break;
                default:
                    columnType  =  ColumnType.Alpha;
                    break;
            }
            
            lv.ListViewItemSorter  =  new  SortListViewItems(e.Column,  
                                                                        columnType,  
                                                                        isAscending);
            lv.Sort();
        }                        //  close  lv_ColumnClick

        private  void  lv_BeforeLabelEdit(object  sender,  LabelEditEventArgs  e)
        {
            MessageBox.Show("About  to  edit\n"  +
                "Item:"  +  e.Item.ToString()  +  "\n"  +
                "label:"  +  e.Label  );
        }

        private  void  lv_AfterLabelEdit(object  sender,  LabelEditEventArgs  e)
        {
            MessageBox.Show("After  edit\n"  +
                "Item:"  +  e.Item.ToString()  +  "\n"  +
                "label:"  +  e.Label  );
        }
    }
}
    
   
  
   




HTML code for linking to this page:

Follow Navioo On Twitter

C# Examples

 Navioo GUI Windows Forms
» File Explore