C#获取文件与文件夹默认图标[转]

本文与《 C#实现带图标菜单 》为同一系列,请参考阅读。

  上篇关于带图标显示菜单的实现办法中大家可以看到我把文件以及文件夹的图标显示在菜单项上,就像在资源管理器中一样。
  那个图标是怎么获取的呢,我在MSDN中搜索了一下,找到了SHGetFileInfo函数,这是Shell32.dll中的一个函数, 具体功能大家还是看MSDN中Platform SDK部分对SHGetFileInfo函数的说明,在这里很难全部都做说明。一下只介绍下我的做法,以及对所遇到的问题的解决方式。
  阅读以下部分前请先浏览:
  SHGetFileInfo函数的大部分参数都是简单的数值类型参数,唯一让我不太明白的是psfi参数,这个参数是一个SHFILEINFO结构体指针,C#中要怎么传这样一个结构体进去呢?我查看了MSDN中.NET框架部分关于 封送类、结构和联合的资料,里面提到了使用ref关键字进行结构体的引用传递,所以我将SHGetFileInfo函数声明为如下格式:

 
None.gif [DllImport( " shell32.dll " , EntryPoint = " SHGetFileInfo " )] 
None.gif
public   static   extern   int  GetFileInfo
None.gif(
string  pszPath,  int  dwFileAttributes,  ref  FileInfomation psfi,  int  cbFileInfo, int  uFlags); 

并根据MSDN中对SHFILEINFO结构体的定义声明了它的C#版本:

None.gif  [ StructLayout( LayoutKind.Sequential)] 
None.gif
public   struct  FileInfomation 
ExpandedBlockStart.gifContractedBlock.gif
dot.gif
InBlock.gif     
public  IntPtr hIcon; 
InBlock.gif     
public   int  iIcon; 
InBlock.gif     
public   int  dwAttributes; 
InBlock.gif
InBlock.gif     [ MarshalAs( UnmanagedType.ByValTStr, SizeConst
= 260 )] 
InBlock.gif     
public   string  szDisplayName; 
InBlock.gif
InBlock.gif     [ MarshalAs( UnmanagedType.ByValTStr, SizeConst
= 80 )] 
InBlock.gif     
public   string  szTypeName; 
ExpandedBlockEnd.gif }

MarshalAs( UnmanagedType.ByValTStr, SizeConst=260)标签可以在MSDN关于 封送类、结构和联合的资料中找到。
搜索了一下Platform SDK的头文件,在ShellApi.h中找到了uFlags的定义,我将这些值声明为 GetFileInfoFlags枚举类型(详细代码在后面),我目前只用到了SHGFI_ICON和SHGFI_SMALLICON,SHGFI_ICON表示要获取文件大图标,SHGFI_SMALLICON表示要获取小图标,我第一次用SHGFI_SMALLICON时程序出现了异常,后来仔细看MSDN才知道 SHGFI_SMALLICON和SHGFI_ICON必须要连用
 
最后我把这些API函数声明、结构体声明、枚举类型声明等东西总的放在一个FileInfo类中,代码我会放在文章的最后部分以防止大家阅读文章不便。
 
最后我在我的文件浏览菜单项中定义了一个静态方法来获取文件夹或者文件的小图标,代码如下:

ExpandedBlockStart.gif ContractedBlock.gif   /**/ ///   <summary>  
InBlock.gif 
///  通过路径获取小图标 
InBlock.gif 
///   </summary>  
InBlock.gif 
///   <param name="path"> 文件或文件夹路径 </param>  
ExpandedBlockEnd.gif 
///   <returns> 获取的图标 </returns>  

None.gif   public   static  Icon GetSmallIcon( string  path) 
ExpandedBlockStart.gifContractedBlock.gif
dot.gif
InBlock.gif     FileInfo.FileInfomation _info 
= new  System.FileInfo.FileInfomation(); 
InBlock.gif
InBlock.gif     FileInfo.GetFileInfo(path, 
0 ref  _info, Marshal.SizeOf(_info), 
InBlock.gif     (
int )(FileInfo.GetFileInfoFlags.SHGFI_ICON | FileInfo.GetFileInfoFlags.SHGFI_SMALLICON)); 
InBlock.gif     
try
ExpandedSubBlockStart.gifContractedSubBlock.gif     
dot.gif
InBlock.gif         
return  Icon.FromHandle(_info.hIcon); 
ExpandedSubBlockEnd.gif     }

InBlock.gif     
catch
ExpandedSubBlockStart.gifContractedSubBlock.gif     
dot.gif
InBlock.gif         
return   null
ExpandedSubBlockEnd.gif     }

ExpandedBlockEnd.gif }


大家可以拿一段代码时候试试看,比图将C盘根目录图标显示在PictureBox里:

None.gif pictureBox.Image  =  GetSmallIcon( " C:\\ " );
 
FileInfo类代码
ExpandedBlockStart.gif ContractedBlock.gif /**/ ///   <summary>  
InBlock.gif 
///  获取文件系统中对象的信息,例如:文件、文件夹、驱动器根目录 
ExpandedBlockEnd.gif 
///   </summary>  

None.gif   public   class  FileInfo 
ExpandedBlockStart.gifContractedBlock.gif
dot.gif
InBlock.gif     [DllImport(
" shell32.dll " , EntryPoint = " SHGetFileInfo " )] 
InBlock.gif     publicstaticexternint GetFileInfo(
string  pszPath,  int  dwFileAttributes, 
InBlock.gif     
ref  FileInfomation psfi,  int  cbFileInfo, int  uFlags); 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif
private  FileInfo() dot.gif{}
InBlock.gif
InBlock.gif     [ StructLayout( LayoutKind.Sequential)] 
InBlock.gif     
public   struct  FileInfomation 
ExpandedSubBlockStart.gifContractedSubBlock.gif     
dot.gif
InBlock.gif         
public  IntPtr hIcon; 
InBlock.gif         
public   int  iIcon; 
InBlock.gif         
public   int  dwAttributes; 
InBlock.gif         [ MarshalAs( UnmanagedType.ByValTStr, SizeConst
= 260 )] 
InBlock.gif         
public   string  szDisplayName; 
InBlock.gif         [ MarshalAs( UnmanagedType.ByValTStr, SizeConst
= 80 )] 
InBlock.gif         
public   string  szTypeName; 
ExpandedSubBlockEnd.gif     }

InBlock.gif     
public   enum  FileAttributeFlags :  int
ExpandedSubBlockStart.gifContractedSubBlock.gif     
dot.gif
InBlock.gif         FILE_ATTRIBUTE_READONLY 
= 0x00000001
InBlock.gif         FILE_ATTRIBUTE_HIDDEN 
= 0x00000002
InBlock.gif         FILE_ATTRIBUTE_SYSTEM 
= 0x00000004
InBlock.gif         FILE_ATTRIBUTE_DIRECTORY 
= 0x00000010
InBlock.gif         FILE_ATTRIBUTE_ARCHIVE 
= 0x00000020
InBlock.gif         FILE_ATTRIBUTE_DEVICE 
= 0x00000040
InBlock.gif         FILE_ATTRIBUTE_NORMAL 
= 0x00000080
InBlock.gif         FILE_ATTRIBUTE_TEMPORARY 
= 0x00000100
InBlock.gif         FILE_ATTRIBUTE_SPARSE_FILE 
= 0x00000200
InBlock.gif         FILE_ATTRIBUTE_REPARSE_POINT 
= 0x00000400
InBlock.gif         FILE_ATTRIBUTE_COMPRESSED 
= 0x00000800
InBlock.gif         FILE_ATTRIBUTE_OFFLINE 
= 0x00001000
InBlock.gif         FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 
= 0x00002000
InBlock.gif         FILE_ATTRIBUTE_ENCRYPTED 
= 0x00004000  
ExpandedSubBlockEnd.gif     }

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

ExpandedBlockEnd.gif }

None.gif


本文与《 C#实现带图标菜单 》为同一系列,请参考阅读。

示例代码下载地址: http://www.cnblogs.com/Files/BG5SBK/[2005-12-13-01]%20XView.rar
示例程序下载地址: http://www.cnblogs.com/Files/BG5SBK/XView_Bin.rar

原文: C#获取文件与文件夹默认图标

转载于:https://www.cnblogs.com/waxic/archive/2007/04/24/725342.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在C#获取文件夹下的文件名,可以使用System.IO命名空间中的Directory类的GetFiles方法。此方法将返回指定目录中的所有文件名(不包括子目录的文件)。以下是一个示例代码: ``` using System; using System.IO; namespace 获取文件文件夹 { class Program { static void Main(string[] args) { string path = @"E:\111"; string[] fls = Directory.GetFiles(path); Console.WriteLine($"根目录名:{path},含有文件数:{fls.Length}"); foreach (string f in fls) { Console.WriteLine($"{f}"); } Console.ReadKey(); } } } ``` 在上面的示例中,首先指定要获取文件名的文件夹路径,然后使用`Directory.GetFiles(path)`方法获取文件夹下的所有文件名,并将结果存储在一个字符串数组中。最后,使用foreach循环遍历数组,将每个文件名打印出来。 希望这可以帮助到你!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C#获取文件文件名称](https://blog.csdn.net/qq_24499417/article/details/104965496)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [C#获取各种文件名](https://blog.csdn.net/weixin_50644076/article/details/125440280)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值