获得Windows中文件类型名称

如何获得windows中文件类型名称,例如txt文件的类型名称“文本文件”;xls文件则显示:“Microsoft Office Excel 97-2003工作表”,使用C#中的FileInfo类是不行的,那么只有导入shell32.dll文件来获得。

首先要导入:

using System.Runtime.InteropServices;

 

方法如下:


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

        
/// <summary>
        
/// 定义SHFILEINFO结构(名字随便起,这里用FileInfomation)
        
/// </summary>
        [StructLayout(LayoutKind.Sequential)]
        
public struct FileInfomation
        {
            
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;
        }

        
/// <summary>
        
/// 定义文件属性标识
        
/// </summary>
        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
        }

        
/// <summary>
        
/// 定义获取资源标识
        
/// </summary>
        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
        }

        
public static string GetFileTypeName(string fileName)
        {
            FileInfomation fileInfo 
= new FileInfomation();  //初始化FileInfomation结构

            
//调用GetFileInfo函数,最后一个参数说明获取的是文件类型(SHGFI_TYPENAME)
            int res = GetFileInfo(fileName, (int)FileAttributeFlags.FILE_ATTRIBUTE_NORMAL,
                
ref fileInfo, Marshal.SizeOf(fileInfo), (int)GetFileInfoFlags.SHGFI_TYPENAME);

            
return fileInfo.szTypeName;
        }

 

使用GetFileTypeName方法可以获得文件类型信息,大家可以试试。

另:同时这个方法也可以用来获得exe文件中的icon图标。

posted @ 2009-03-07 01:46  阿哲  阅读(665)  评论(0编辑  收藏  举报