• 仿资源管理器功能实现


    以前的一个项目myTree中仿资源管理器功能实现,,忘记的差不多了。可能是按照网络现成实例做的。

    自定义功能函数:
         myExtractIcon(...)和SetIcon(...)函数功能是获取文件夹和文件的图标。
         GetDrive()  获取系统驱动器时调用。
         AddDirectories(...)   获得当前目录下的所有目录。填充树壮控件
         ListViewAB(...)  在大图标、小图标、详细列表切换时调用
         InitList(...)   填充列表框
         InitList2(...)  同InitList一样,只是参数不一样。在列表框中双击目录时调用。
     
      主要事件
    1:TreeView控件的BeforeExpand事件;该事件是TreeView控件的节点展开时发生。
    2:TreeView控件的AfterSelect事件;该事件是TreeView控件的节点选中时发生。
    3:ListView控件的ItemActivate事件。该事件是在ListView控件中双击选中的文件时发生。

      在GetDrive()函数中将"G"光盘符,换成你电脑中的光盘符。
                                    
        本程序主要应用了C#中的DirectoryInfo和FileInfo类。使用了2个获取文件图标的API函数。
    代码如下:

    private System.Windows.Forms.TreeView treeView1;
    private System.Windows.Forms.ListView listView1;

     [DllImport(
    "Shell32.dll")] 
      
    public static extern int ExtractIcon(IntPtr h,string strx,int ii);

      [DllImport(
    "Shell32.dll")] 
      
    public static extern int SHGetFileInfo(string pszPath,uint dwFileAttributes,ref SHFILEINFO psfi,uint cbFileInfo, uint uFlags);

      
    public struct SHFILEINFO
      

       
    public IntPtr hIcon;  
       
    public int   iIcon;  
       
    public uint dwAttributes;
       
    public char szDisplayName; 
       
    public char szTypeName; 
      }

     
      
    //在shell32.dll导入函数SHGetFileInfo
      [DllImport("shell32.dll", EntryPoint="SHGetFileInfo")]
      
    public static extern int GetFileInfo(string pszPath, int dwFileAttributes,
      
    ref MyFileInfomation psfi, int cbFileInfo,int uFlags);

      
    //定义SHFILEINFO结构(名字随便起,这里用MyFileInfomation)
      [StructLayout(LayoutKind.Sequential)]
       
    public struct MyFileInfomation
      
    {
      
    public IntPtr hIcon;
      
    public int iIcon;
      
    public int dwAttributes;

      [MarshalAs(UnmanagedType.ByValTStr, SizeConst
    =260)]
      
    public string szDisplayName;

      [MarshalAs(UnmanagedType.ByValTStr, SizeConst
    =80)]
      
    public string szTypeName;
      }


      
    //定义文件属性标识
      public enum FileAttributeFlags : int
      
    {
      FILE_ATTRIBUTE_READONLY      
    =0x00000001,
      FILE_ATTRIBUTE_HIDDEN              
    =0x00000002,
      FILE_ATTRIBUTE_SYSTEM              
    =0x00000004,
      FILE_ATTRIBUTE_DIRECTORY      
    =0x00000010,
      FILE_ATTRIBUTE_ARCHIVE       
    =0x00000020,
      FILE_ATTRIBUTE_DEVICE              
    =0x00000040,
      FILE_ATTRIBUTE_NORMAL              
    =0x00000080,
      FILE_ATTRIBUTE_TEMPORARY      
    =0x00000100,
      FILE_ATTRIBUTE_SPARSE_FILE     
    =0x00000200,
      FILE_ATTRIBUTE_REPARSE_POINT    
    =0x00000400,
      FILE_ATTRIBUTE_COMPRESSED          
    =0x00000800,
      FILE_ATTRIBUTE_OFFLINE       
    =0x00001000,
      FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 
    =0x00002000,
      FILE_ATTRIBUTE_ENCRYPTED      
    =0x00004000
     }


     
    //定义获取资源标识
     public enum GetFileInfoFlags : int
     
    {
      SHGFI_ICON              
    =0x000000100,   // get icon
      SHGFI_DISPLAYNAME       =0x000000200,   // get display name
      SHGFI_TYPENAME          =0x000000400,   // get type name
      SHGFI_ATTRIBUTES        =0x000000800,   // get attributes
      SHGFI_ICONLOCATION      =0x000001000,   // get icon location
      SHGFI_EXETYPE           =0x000002000,   // return exe type
      SHGFI_SYSICONINDEX      =0x000004000,   // get system icon index
      SHGFI_LINKOVERLAY       =0x000008000,   // put a link overlay on icon
      SHGFI_SELECTED          =0x000010000,   // show icon in selected state
      SHGFI_ATTR_SPECIFIED    =0x000020000,   // get only specified attributes
      SHGFI_LARGEICON         =0x000000000,   // get large icon
      SHGFI_SMALLICON         =0x000000001,   // get small icon
      SHGFI_OPENICON          =0x000000002,   // get open icon
      SHGFI_SHELLICONSIZE     =0x000000004,   // get shell size icon
      SHGFI_PIDL              =0x000000008,   // pszPath is a pidl
      SHGFI_USEFILEATTRIBUTES =0x000000010,   // use passed dwFileAttribute
      SHGFI_ADDOVERLAYS       =0x000000020,   // apply the appropriate overlays
      SHGFI_OVERLAYINDEX      =0x000000040      // Get the index of the overlay
    }


    //********************************************************************************

      
    string strFilePath="";
      
    //************************************************************************************* 
     
      
    protected virtual Icon myExtractIcon(string FileName,int iIndex)
      
    {
       
    try
       
    {
        IntPtr hIcon
    =(IntPtr)ExtractIcon(this.Handle,FileName,iIndex);
        
    if(! hIcon.Equals(null))
        
    {
         Icon icon
    =Icon.FromHandle(hIcon);
         
    return icon;
        }

       }

       
    catch(Exception ex)
       
    { MessageBox.Show(ex.Message,"错误提示",0,MessageBoxIcon.Error);} 
       
    return null;
      }

      
    //*************************************************************************************

      
    protected virtual void SetIcon(ImageList imageList,string FileName,bool tf)
      
    {
       SHFILEINFO fi
    =new SHFILEINFO();
       
    if(tf==true)
       
    {
        
    int iTotal=(int)SHGetFileInfo(FileName,0,ref fi,100,  16640);//SHGFI_ICON|SHGFI_SMALLICON
        try
        
    {
         
    if(iTotal >0)
         
    {
          Icon ic
    =Icon.FromHandle(fi.hIcon);
          imageList.Images.Add(ic);
          
    //return ic;
         }

        }

        
    catch(Exception ex)
        
    { MessageBox.Show(ex.Message,"错误提示",0,MessageBoxIcon.Error);} 
       }

       
    else
       
    {
        
    int iTotal=(int)SHGetFileInfo(FileName,0,ref fi,100,  257);
        
    try
        
    {
         
    if(iTotal >0)
         
    {
          Icon ic
    =Icon.FromHandle(fi.hIcon);
          imageList.Images.Add(ic);
          
    //return ic;
         }

        }

        
    catch(Exception ex)
        
    { MessageBox.Show(ex.Message,"错误提示",0,MessageBoxIcon.Error);} 
       }

       
    // return null;
      }

      
    //*************************************************************************************

    构造函数中 :
     Icon ic0
    =myExtractIcon("%SystemRoot%\\system32\\shell32.dll",15);
       TreeImageList.Images.Add(ic0);
       Icon ic1
    =myExtractIcon("%SystemRoot%\\system32\\shell32.dll",5);
       TreeImageList.Images.Add(ic1);
       Icon ic2
    =myExtractIcon("%SystemRoot%\\system32\\shell32.dll",7);
       TreeImageList.Images.Add(ic2);
       Icon ic3
    =myExtractIcon("%SystemRoot%\\system32\\shell32.dll",11);
       TreeImageList.Images.Add(ic3);

       Icon ic4
    =myExtractIcon("%SystemRoot%\\system32\\shell32.dll",3);
       TreeImageList.Images.Add(ic4);
       Icon ic5
    =myExtractIcon("%SystemRoot%\\system32\\shell32.dll",4);
       TreeImageList.Images.Add(ic5);
       Icon ic6
    =myExtractIcon("%SystemRoot%\\system32\\shell32.dll",101);
       TreeImageList.Images.Add(ic6);


       
    this.directoryPath=@Application.StartupPath;
       GetDrive();
    //*************************************************************************************

      
    public void GetDrive()
      
    {
       treeView1.ImageList
    =TreeImageList;
      
       TreeNode rootNode;
       
       DirectoryInfo info 
    = new DirectoryInfo(this.directoryPath); 
       
    if (info.Exists)
       
    {
        rootNode 
    = new TreeNode(info.Name,4,5);
        rootNode.Tag 
    = info;
        GetDirectories(info.GetDirectories(), rootNode);
        
    this.treeView1.Nodes.Add(rootNode);
        
    this.pre_Path=@RemoveInfoName();
       }

      }

      
    //*************
    private void GetDirectories(DirectoryInfo[] subDirs, TreeNode nodeToAddTo)
      
    {
       TreeNode aNode;
       DirectoryInfo[] subSubDirs;
       
    foreach (DirectoryInfo subDir in subDirs)
       
    {
        aNode 
    = new TreeNode(subDir.Name,45);
        aNode.Tag 
    = subDir;
        subSubDirs 
    = subDir.GetDirectories();
        
    if (subSubDirs.Length != 0)
        
    {
         GetDirectories(subSubDirs, aNode);
        }

        nodeToAddTo.Nodes.Add(aNode);
       }

      }


    private string RemoveInfoName()
      
    {
       
    string disk=string.Empty;
       DirectoryInfo info 
    = new DirectoryInfo(this.directoryPath); 
       
    if (info.Exists)
       
    {
        
    int index1=this.directoryPath.IndexOf(info.Name);
        disk
    =this.directoryPath.Substring(0,index1);
        
       }

       
    return disk;
      }



      
    void AddDirectories(TreeNode tn)
      
    {
       tn.Nodes.Clear();
       
    string strPath=@RemoveInfoName();
       strPath
    =strPath.Remove(0,5);

       
    //获得当前目录
       DirectoryInfo   dirinfo = new DirectoryInfo(strPath);
       DirectoryInfo[] adirinfo;
       
    try
       
    {
        adirinfo 
    = dirinfo.GetDirectories();
       }

       
    catch
       
    return;}

       
    int iImageIndex=4;  int iSelectedIndex=5;
       
    foreach (DirectoryInfo di in adirinfo)
       
    {
        
    if(di.Name=="RECYCLER"||di.Name=="RECYCLED"||di.Name=="Recycled")
        
    {iImageIndex=6;  iSelectedIndex=6;}
        
    else 
        
    {iImageIndex=4;  iSelectedIndex=5;}

        TreeNode tnDir 
    = new TreeNode(di.Name, iImageIndex, iSelectedIndex);
        tn.Nodes.Add(tnDir);
       }


      }

      
    //*************************************************************************************
     private void treeView1_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
      
    {
       
    if(e.Node.Text=="我的电脑")    
       
    return;}

       InitList(e.Node);
      }


    //*************************************************************************************

    protected virtual void InitList(TreeNode tn)
      
    {
       
    this.statusBarPanel1.Text="正在刷新文件夹,请稍等..";
       
    this.Cursor=Cursors.WaitCursor;

       
    this.LisrimageList2.Images.Clear();
       
    this.LisrimageList.Images.Clear();
       listView1.SmallImageList
    =LisrimageList;
       Icon ic0
    =myExtractIcon("%SystemRoot%\\system32\\shell32.dll",3);
       LisrimageList.Images.Add(ic0);
       LisrimageList2.Images.Add(ic0);

       listView1.Clear();
       
    //设置列表框的表头
       listView1.Columns.Add("文件名",160,HorizontalAlignment.Left);
       listView1.Columns.Add(
    "文件大小",120,HorizontalAlignment.Left);
       listView1.Columns.Add(
    "创建时间",120,HorizontalAlignment.Left);
       listView1.Columns.Add(
    "访问时间",200,HorizontalAlignment.Left);
       listView1.Columns.Add(
    "文件类型",160,HorizontalAlignment.Left);

      
       
    string strPath=this.pre_Path+this.treeView1.SelectedNode.FullPath;

    //   strPath=strPath.Remove(0,5);
       
    //获得当前目录下的所有文件 
       DirectoryInfo curDir=new DirectoryInfo(strPath) ;//);//创建目录对象。
       FileInfo[] dirFiles;
       
    try
       
    {
        dirFiles
    =curDir.GetFiles();
       }

       
    catch  return;}

       
    string []arrSubItem=new string[5];
       
    //文件的创建时间和访问时间。
       int iCount=0;    int iconIndex=1;//用1,而不用0是要让过0号图标。
       foreach(FileInfo fileInfo in dirFiles)
       
    {
        
    string strFileName=fileInfo.Name;           
                
        
    //如果不是文件pagefile.sys
        if(! strFileName.Equals("pagefile.sys"))
        
    {
         arrSubItem[
    0]=strFileName;
         arrSubItem[
    1]=fileInfo.Length+" 字节";
         arrSubItem[
    2]=fileInfo.CreationTime.ToString();
         arrSubItem[
    3]=fileInfo.LastAccessTime.ToString();
    //     string flex =System.IO.Path.GetExtension(strFileName);
         arrSubItem[4]=GetTypeName(strFileName);  //fileInfo.Attributes.ToString();

        }

        
    else
        
    { arrSubItem[1]="未知大小"; arrSubItem[2]="未知日期"; arrSubItem[3]="未知日期";}
       

        
    //得到每个文件的图标
        string str=fileInfo.FullName;
        
    try
        
    {
         SetIcon(LisrimageList,str,
    false);
         SetIcon(LisrimageList2,str,
    true);
        }

        
    catch(Exception ex)
        
    { MessageBox.Show(ex.Message,"错误提示",0,MessageBoxIcon.Error);}
            

        
    //插入列表项    
        ListViewItem LiItem=new ListViewItem(arrSubItem,iconIndex);
        listView1.Items.Insert(iCount,LiItem);

        iCount
    ++
        iconIndex
    ++;
       }

       strFilePath
    =strPath;
       textBox1.Text
    =strPath;
       
    this.statusBarPanel1.Text=strPath;
       
    this.statusBarPanel2.Text="文件数量: " + iCount.ToString()+"";
       
    this.Cursor=Cursors.Arrow;

     

       
    //以下是向列表框中插入目录,不是文件。获得当前目录下的各个子目录。
       int iItem=0;

       DirectoryInfo Dir
    =new DirectoryInfo(strPath);
       
    foreach(DirectoryInfo di in Dir.GetDirectories())
       
    {   
        ListViewItem LiItem
    =new ListViewItem(di.Name,0);
        listView1.Items.Insert(iItem,LiItem);
        iItem
    ++;
       }


      }
     


        
    protected virtual void InitList2(string strName)
            
    {
                
    this.statusBarPanel1.Text="正在刷新文件夹,请稍等..";
                
    this.Cursor=Cursors.WaitCursor;

                
    this.LisrimageList2.Images.Clear();
                
    this.LisrimageList.Images.Clear();
                listView1.SmallImageList
    =LisrimageList;
                Icon ic0
    =myExtractIcon("%SystemRoot%\\system32\\shell32.dll",3);
                LisrimageList.Images.Add(ic0);
                LisrimageList2.Images.Add(ic0);

                listView1.Clear();
                
    //设置列表框的表头
                listView1.Columns.Add("文件名",160,HorizontalAlignment.Left);
                listView1.Columns.Add(
    "文件大小",120,HorizontalAlignment.Left);
                listView1.Columns.Add(
    "创建时间",120,HorizontalAlignment.Left);
                listView1.Columns.Add(
    "访问时间",200,HorizontalAlignment.Left);
            listView1.Columns.Add(
    "文件类型",160,HorizontalAlignment.Left);
      
                
    //获得当前目录下的所有文件 
                DirectoryInfo curDir=new DirectoryInfo(strName);//创建目录对象。
                FileInfo[] dirFiles;
                
    try
                
    {
                    dirFiles
    =curDir.GetFiles();
                }

                
    catch  return;}

                
    string []arrSubItem=new string[5];
                
    //文件的创建时间和访问时间。
                int iCount=0;    int iconIndex=1;//用1,而不用0是要让过0号图标。
                foreach(FileInfo fileInfo in dirFiles)
                
    {
                    
    string strFileName=fileInfo.Name;           
                
                    
    //如果不是文件pagefile.sys
                    if(! strFileName.Equals("pagefile.sys"))
                    
    {
                        arrSubItem[
    0]=strFileName;
                        arrSubItem[
    1]=fileInfo.Length+" 字节";
                        arrSubItem[
    2]=fileInfo.CreationTime.ToString();
                        arrSubItem[
    3]=fileInfo.LastAccessTime.ToString();
                        arrSubItem[
    4]=GetTypeName(strFileName);
                    }

                    
    else
                    
    { arrSubItem[1]="未知大小"; arrSubItem[2]="未知日期"; arrSubItem[3]="未知日期";}
       

                    
    //得到每个文件的图标
                    string str=fileInfo.FullName;
                    
    try
                    
    {
                        SetIcon(LisrimageList,str,
    false);
                        SetIcon(LisrimageList2,str,
    true);
                    }

                    
    catch(Exception ex)
                    
    { MessageBox.Show(ex.Message,"错误提示",0,MessageBoxIcon.Error);}
            

                    
    //插入列表项    
                    ListViewItem LiItem=new ListViewItem(arrSubItem,iconIndex);
                    listView1.Items.Insert(iCount,LiItem);

                    iCount
    ++
                    iconIndex
    ++;//必须加在listView1.Items.Insert(iCount,LiItem);
                }

                strFilePath
    =strName;//把路径赋值于全局变量strFilePath

                textBox1.Text
    =strName;
                
    this.statusBarPanel2.Text="文件数量: " + iCount.ToString()+"";
                
    this.Cursor=Cursors.Arrow;

     

                
    //以下是向列表框中插入目录,不是文件。获得当前目录下的各个子目录。
                int iItem=0;//调用listView1.Items.Insert(iItem,LiItem);时用。不能使用iconIndex。

                DirectoryInfo Dir
    =new DirectoryInfo(strName);//创建目录对象。
                foreach(DirectoryInfo di in Dir.GetDirectories())
                
    {   
                    ListViewItem LiItem
    =new ListViewItem(di.Name,0);
                    listView1.Items.Insert(iItem,LiItem);
                    iItem
    ++;
                }


            }
     

      
    //*************************************************************************************
     
     
    private void listView1_ItemActivate(object sender, System.EventArgs e)
      
    {
       
    string str=Path.Combine(strFilePath,listView1.FocusedItem.Text);
       
    try
       
    {
        
    if(listView1.FocusedItem.SubItems.Count>1)
        

        System.Diagnostics.Process.Start(str); 
        }

        
    else
        
    { InitList2(str); }
       }

       
    catch  return;}
      }

      
    //*************************************************************************************
    private string GetTypeName(string fileName)
    {
      MyFileInfomation fileInfo 
    = new MyFileInfomation();//初始化MyFileInfomation结构
      
      
    //调用GetFileInfo函数,最后一个参数说明获取的是文件类型(SHGFI_TYPENAME)
      int res = GetFileInfo(fileName, (int)FileAttributeFlags.FILE_ATTRIBUTE_NORMAL,
        
    ref fileInfo, Marshal.SizeOf(fileInfo), (int)GetFileInfoFlags.SHGFI_TYPENAME);

      
    return fileInfo.szTypeName;
    }


  • 相关阅读:
    java8流处理,不生产博客,做个好博客的搬运工
    java.util.ConcurrentModificationException异常分析
    App登录状态维持
    tomcat没有发布maven项目依赖的本地jar包
    Json对象和Json字符串的区别
    java过滤关键词
    过滤3个字节以上的utf-8字符
    Incorrect string value: 'xF0x9Fx98x84xF0x9F
    SpringBoot配置属性之DataSource
    linux nohup命令使程序在后台运行的方法
  • 原文地址:https://www.cnblogs.com/flashicp/p/696664.html
Copyright © 2020-2023  润新知