用C#获取文件类型信息

http://www.bugucn.com/2011/12/821.html

用C#获取文件类型信息

发布由 efour on 01 十二 2011 / 0 Comment

原帖及讨论:http://bbs.bccn.net/thread-87653-1-1.html

[手动查看]
资源管理器 -> 工具 -> 文件夹选项 -> 文件类型

[C/C++]
#include <windows.h>
#include <shellapi.h> //SHFILEINFO结构和SHGetFileInfo函数所在
//#include <stdio.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{
    SHFILEINFO shfi;
    memset(&shfi,0,sizeof(shfi));
    SHGetFileInfo(“C:\\Windows\\notepad.exe”, //文件路径
        FILE_ATTRIBUTE_NORMAL,                //文件属性
        &shfi,                                //信息结构
        sizeof(shfi),
        SHGFI_TYPENAME);                      //获取标识
 
    char *msg = shfi.szTypeName;
   
    //在dos窗口输出
    //printf(“%s\n”,msg);
    //getchar();
   
    LPCTSTR lpcstr = (LPCTSTR)msg; //char*转换LPCTSTR
    MessageBox(NULL, lpcstr, “文件类型”, MB_OK);
    return 0;
}

[C#] – mode 1
using Microsoft.Win32;

//通过查询注册表来获取文件类型名称,但此方法具有致命缺陷!
string ext = “.mp3″;
string desc = (string)Registry.ClassesRoot.OpenSubKey(ext).GetValue(null);
string typeinfo = (string)Registry.ClassesRoot.OpenSubKey(desc).GetValue(null);

[C#] – mode 2
using System.Runtime.InteropServices;

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

//定义SHFILEINFO结构(名字随便起,这里用FileInfomation)
[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;
}

//定义文件属性标识
public enum FileAttributeFlags : int
{
    FILE_ATTRIBUTE_READONLY            =0×00000001,
    FILE_ATTRIBUTE_HIDDEN              =0×00000002,
    FILE_ATTRIBUTE_SYSTEM              =0×00000004,
    FILE_ATTRIBUTE_DIRECTORY           =0×00000010,
    FILE_ATTRIBUTE_ARCHIVE             =0×00000020,
    FILE_ATTRIBUTE_DEVICE              =0×00000040,
    FILE_ATTRIBUTE_NORMAL              =0×00000080,
    FILE_ATTRIBUTE_TEMPORARY           =0×00000100,
    FILE_ATTRIBUTE_SPARSE_FILE         =0×00000200,
    FILE_ATTRIBUTE_REPARSE_POINT       =0×00000400,
    FILE_ATTRIBUTE_COMPRESSED          =0×00000800,
    FILE_ATTRIBUTE_OFFLINE             =0×00001000,
    FILE_ATTRIBUTE_NOT_CONTENT_INDEXED =0×00002000,
    FILE_ATTRIBUTE_ENCRYPTED           =0×00004000
}

//定义获取资源标识
public enum GetFileInfoFlags : int
{
    SHGFI_ICON              =0×000000100,     // get icon
    SHGFI_DISPLAYNAME       =0×000000200,     // get display name
    SHGFI_TYPENAME          =0×000000400,     // get type name
    SHGFI_ATTRIBUTES        =0×000000800,     // get attributes
    SHGFI_ICONLOCATION      =0×000001000,     // get icon location
    SHGFI_EXETYPE           =0×000002000,     // return exe type
    SHGFI_SYSICONINDEX      =0×000004000,     // get system icon index
    SHGFI_LINKOVERLAY       =0×000008000,     // put a link overlay on icon
    SHGFI_SELECTED          =0×000010000,     // show icon in selected state
    SHGFI_ATTR_SPECIFIED    =0×000020000,     // get only specified attributes
    SHGFI_LARGEICON         =0×000000000,     // get large icon
    SHGFI_SMALLICON         =0×000000001,     // get small icon
    SHGFI_OPENICON          =0×000000002,     // get open icon
    SHGFI_SHELLICONSIZE     =0×000000004,     // get shell size icon
    SHGFI_PIDL              =0×000000008,     // pszPath is a pidl
    SHGFI_USEFILEATTRIBUTES =0×000000010,     // use passed dwFileAttribute
    SHGFI_ADDOVERLAYS       =0×000000020,     // apply the appropriate overlays
    SHGFI_OVERLAYINDEX      =0×000000040      // Get the index of the overlay
}

private string GetTypeName(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;
}

private void Form1_Load(object sender, System.EventArgs e)
{
    string fileName = @”C:\Windows\notepad.exe”;  //定义文件路径
    string fileTypeName = GetTypeName(fileName);

    MessageBox.Show(fileTypeName);
}

后记:搞了一个深夜,一头雾水~~~

[示例源代码]
点击下载该文件

此主题相关图片如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值